java - 设置由 TextChangedListener 调用的方法
问题描述
-编辑 2020 年 5 月 27 日-
我的代码进一步进步了一点,现在我正在尝试使用 onTextChangedListener 获取更新的成本。它似乎在做它的工作,但它总是对每个值使用 int 0,即使在它改变之后,你也可以看到值被“刷新”。我希望我的代码中有一些我没有发现的问题。我期待大家的意见。
final Button bContinue = findViewById(R.id.bContinue);
final EditText etHamburger = findViewById(R.id.etHamburger);
final EditText etHotdog = findViewById(R.id.etHotdog);
final EditText etDrink = findViewById(R.id.etDrink);
final EditText etSpecialInstructions = findViewById(R.id.etSpecialInstructions);
final EditText tvCost = findViewById(R.id.tvCost);
etHamburger.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
int Hamburger;
try {
Hamburger = Integer.parseInt(String.valueOf(etHamburger));
} catch (NumberFormatException e) {
Hamburger = 0;
}
int Hotdog;
try {
Hotdog = Integer.parseInt(String.valueOf(etHotdog));
} catch (NumberFormatException e) {
Hotdog = 0;
}
int Drink;
try {
Drink = Integer.parseInt(String.valueOf(etDrink));
} catch (NumberFormatException e) {
Drink = 0;
}
int cost = Hamburger + Drink + Hotdog;
String message = "Total Cost $ " + cost;
tvCost.setText(message);
}
});
bContinue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent OrderIntent = new Intent(order.this, ContactInfo.class);
OrderIntent.putExtra("etHamburger", String.valueOf(etHamburger));
OrderIntent.putExtra("etHotdog", String.valueOf(etHotdog));
OrderIntent.putExtra("etDrink", String.valueOf(etDrink));
OrderIntent.putExtra("etSpecialInstructions", (Parcelable) etSpecialInstructions);
OrderIntent.putExtra("tvCost", (Parcelable) tvCost);
order.this.startActivity(OrderIntent);
}
});
}
}
-原始问题和代码-
我无法让这段代码正常工作,我一直在寻找解决方案,但似乎找不到。这是我的代码。我只是想得到它,以便我的 TextChangedListener 在用户更改数量后激活一种方法来重新计算总数。我搜索了其他帖子以找到我的答案,但没有看到我在寻找什么,但我对此也很陌生。目前我在创建方法时遇到问题,我的 TextChangedListener 似乎正在工作。
package com.example.foodordering;
import android.content.Intent;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.GetChars;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.TextView;
public class order extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order);
final Button bContinue = findViewById(R.id.bContinue);
final EditText etHamburger = findViewById(R.id.etHamburger);
final EditText etHotdog = findViewById(R.id.etHotdog);
final EditText etDrink = findViewById(R.id.etDrink);
final EditText etSpecialInstructions = findViewById(R.id.etSpecialInstructions);
final EditText tvCost = findViewById(R.id.tvCost);
public void calculate(){
int Hamburger;
try {
Hamburger = Integer.parseInt(String.valueOf(etHamburger));
} catch (NumberFormatException e) {
Hamburger = 0;
}
int Hotdog;
try {
Hotdog = Integer.parseInt(String.valueOf(etHotdog));
} catch (NumberFormatException e) {
Hotdog = 0;
}
int Drink;
try {
Drink = Integer.parseInt(String.valueOf(etDrink));
} catch (NumberFormatException e) {
Drink = 0;
}
int cost = Hamburger + Hotdog + Drink;
String message = "Order Total $" + cost;
tvCost.setText(message);
}
etHamburger.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
calculate();
}
});
bContinue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent OrderIntent = new Intent(order.this, ContactInfo.class);
OrderIntent.putExtra("etHamburger", (Parcelable) etHamburger);
OrderIntent.putExtra("etHotdog", (Parcelable) etHotdog);
OrderIntent.putExtra("etDrink", (Parcelable) etDrink);
OrderIntent.putExtra("etSpecialInstructions", (Parcelable) etSpecialInstructions);
order.this.startActivity(OrderIntent);
}
});
}
}
解决方案
解决方案!
将消息论坛更改为将双精度值而不是整数相加并添加到异常捕获器中,因此 null = 0 而不是 null。
您可以将此代码与初始问题代码进行比较以查看更改。
这基本上会在您对 EditText 框进行更改时自动更新总量,从而实现即时更新。
希望这对将来的某人有所帮助。
package com.example.foodordering;
import android.content.Intent;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class order extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order);
final Button bContinue = findViewById(R.id.bContinue);
final EditText etHamburger = findViewById(R.id.etHamburger);
final EditText etHotdog = findViewById(R.id.etHotdog);
final EditText etDrink = findViewById(R.id.etDrink);
final TextView tvCost = findViewById(R.id.tvCost);
final EditText etSpecialInstructions = findViewById(R.id.etSpecialInstructions);
etHamburger.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
calculate();
}
});
etHotdog.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
calculate();
}
});
etDrink.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
calculate();
}
});
bContinue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent OrderIntent = new Intent(order.this, ContactInfo.class);
OrderIntent.putExtra("etHamburger", String.valueOf(etHamburger));
OrderIntent.putExtra("etHotdog", String.valueOf(etHotdog));
OrderIntent.putExtra("etDrink", String.valueOf(etDrink));
OrderIntent.putExtra("etSpecialInstructions", (Parcelable) etSpecialInstructions);
OrderIntent.putExtra("tvCost", (Parcelable) tvCost);
order.this.startActivity(OrderIntent);
}
});
}
private void calculate(){
final EditText etHamburger = findViewById(R.id.etHamburger);
final EditText etHotdog = findViewById(R.id.etHotdog);
final EditText etDrink = findViewById(R.id.etDrink);
final TextView tvCost = findViewById(R.id.tvCost);
String etHamburgerStr = etHamburger.getText().toString();
String etHotdogStr = etHotdog.getText().toString();
String etDrinkStr = etDrink.getText().toString();
double etHamburgerDbl;
try {
etHamburgerDbl = Double.parseDouble(etHamburgerStr);
} catch (NumberFormatException e) {
etHamburgerDbl = 0;
}
double etHotdogDbl;
try {
etHotdogDbl = Double.parseDouble(etHotdogStr);
} catch (NumberFormatException e) {
etHotdogDbl = 0;
}
double etDrinkDbl;
try {
etDrinkDbl = Double.parseDouble(etDrinkStr);
} catch (NumberFormatException e) {
etDrinkDbl = 0;
}
double cost = (etHamburgerDbl + etDrinkDbl + etHotdogDbl);
String costmessage = "Total Cost $" + cost;
tvCost.setText(costmessage);
}
}
推荐阅读
- amazon-web-services - AWS Lambda 函数:它不显示现有角色的列表
- mysql - 查看 Libreoffice Base 对 mysql 的查询
- python - 如何使用 Django Filters 过滤同一字段的多个值?
- python - 从 Python 中的父文件夹导入模块
- c# - 无法使用 SharePoint 客户端 API 列出文件/文件夹
- sql - 如何使用 LINQ 使用一个表获取另一个表的值
- python - 使用 selenium 捕获网络请求
- authentication - 在 cakephp 3 中对多个模型使用身份验证
- git - 通过 LibGit2Sharp 将 Blazor GitHub 存储库文件放入索引数据库
- dbt - 嗨,我们如何将 select 语句定义为 dbt 中的变量?