大家好我已经按照以下示例http://www.google.com/codesearch#search/&q=NumberFormattingTextWatcher&exact_package=android&type=cs
我将CurrencyTextWatcher作为单独的类。我需要这个,因为我将申请几页。
我无法弄清楚为什么,但是如果我使用 setContentView(text)它只能用作1个大文本框,那么我就看不到我的xml的剩余部分了。
如果我使用 setContentView(R.layout.main); 我的xml正常工作,除了TextWatcher不会触发我的 txta EditText框
爪哇
public class CalcTestActivity extends Activity {
private EditText txta;
private TextView txtb;
private TextView txtc;
private EditText text;
private double a = 0;
private double b = 0;
private double c = 0;
private Button buttonCalc;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initControls();
text = new EditText(this);
text.addTextChangedListener(new CurrencyTextWatcher());
//setContentView(text);
}
private String FormatValue(double value)
{
NumberFormat nf = NumberFormat.getInstance();
return "$ "+ nf.format(value);
}
private void initControls() {
txta = (EditText)findViewById(R.id.txta);
txtb = (TextView)findViewById(R.id.txtb);
txtc = (TextView)findViewById(R.id.txtc);
buttonCalc = (Button)findViewById(R.id.buttonCalc);
buttonCalc.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {calculate(); }
private void calculate() {
a=Double.parseDouble(txta.getText().toString());
b=Math.round(a*.88);
txtb.setText(FormatValue(b));
c=Math.round((a*.87)-(b*.28));
txtc.setText(FormatValue(c));
}
});
}
}
CurrencyTextWatcher类
public class CurrencyTextWatcher implements TextWatcher {
boolean mEditing;
public CurrencyTextWatcher() {
mEditing = false;
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if(!mEditing) {
mEditing = true;
String digits = s.toString().replaceAll("\\D", "");
NumberFormat nf = NumberFormat.getCurrencyInstance();
try{
String formatted = nf.format(Double.parseDouble(digits)/100);
s.replace(0, s.length(), formatted);
} catch (NumberFormatException nfe) {
s.clear();
}
mEditing = false;
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
}
XML
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Number1"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/txta"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:numeric="integer"/>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Number2"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/txtb"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Your Answer is"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/txtc"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:hint="0" />
<Button
android:id="@+id/buttonCalc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Calculate" />
</LinearLayout>
答案 0 :(得分:1)
我拿了你的代码。我发现你在这里分享的代码是从xml获取所有视图。 在这种情况下,您正在呼叫
text.addTextChangedListener(new CurrencyTextWatcher());
在你的onCreate方法中,其中文本是使用java完成的。您不会收到onTextChanged,beforeTextChanged或afterTextChanged的回调,因为您的所有视图都是从xml中获取的。所以请在你的
之后initControls();
在onCreate()中添加以下行
txta.addTextChangedListener(new CurrencyTextWatcher());
和评论
text.addTextChangedListener(new CurrencyTextWatcher());
不需要该行。我已经证实它的工作正常。
如果作品投票并接受答案
答案 1 :(得分:0)
你在afterTextChanged中实现的代码对onTextChanged实现了相同的代码。它会触发并回拨。
其次,如果视图中存在问题,请检查您的布局及其参数。如果它不合适,它将无法在UI中正确显示