Java 如何在编辑文本时自动更改文本视图&;Seekbar已更改
我的应用程序的工作原理如下: 它有4个Java 如何在编辑文本时自动更改文本视图&;Seekbar已更改,java,android,android-layout,Java,Android,Android Layout,我的应用程序的工作原理如下: 它有4个EditText(输入类型:number),通过编程方式链接到4个Seekbar。如果EditTextA被更改,则SeekbarA的进度将根据EditTextA的数值更改。如果EditTextA的值为40,则Seekbar将其进度更改为40%。反之亦然,如果我将SeekbarA的进度拖动到50%,则EditText值将为50 然后我有了这个文本视图,我想显示A&B&C&D的总值。因此,如果A被更改(使用Seekbar/编辑文本),该值也会更改 我已经试过了
EditText
(输入类型:number),通过编程方式链接到4个Seekbar
。如果EditText
A被更改,则Seekbar
A的进度将根据EditText
A的数值更改。如果EditText
A的值为40,则Seekbar
将其进度更改为40%。反之亦然,如果我将Seekbar
A的进度拖动到50%,则EditText
值将为50
然后我有了这个文本视图
,我想显示A&B&C&D的总值。因此,如果A被更改(使用Seekbar
/编辑文本
),该值也会更改
我已经试过了
setText((Integer.parseInt(EditTextA.getText().toString())) + (Integer.parseInt(EditTextB.getText().toString()) + (Integer.parseInt(EditTextC.getText().toString()) + (Integer.parseInt(EditTextD.getText().toString()));
但它给了我一个错误:
原因:android.content.res.Resources$NotFoundException:String
资源ID#0x0
即使它能工作,它也不能解决我和Seekbar的关系
seekbar和editText的我的代码:
seekbarPrice.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
valuePrice.setText(String.valueOf(seekBar.getProgress()));
}
});
valuePrice.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
try {
seekbarPrice.setProgress(Integer.parseInt(editable.toString()));
} catch (Exception ex) {
}
;
}
});
提前谢谢! 编辑: @Muthukrishnan Rajendran的解决方案有效,但它给了我另一个错误 如果我更改edittext A而不先擦除edittext中的所有数字(如40->4(擦除5)->45),代码会工作。 但如果我先擦除所有数字(40->(全部擦除)),则会产生以下错误:
FATAL EXCEPTION: main
Process: id.ac.umn.mobile.skripsi, PID: 5996
java.lang.NumberFormatException: Invalid int: ""
at java.lang.Integer.invalidInt(Integer.java:138)
at java.lang.Integer.parseInt(Integer.java:358)
at java.lang.Integer.parseInt(Integer.java:334)
at PreferencesActivity.updateText(PreferencesActivity.java:53)
at PreferencesActivity.access$000(PreferencesActivity.java:40)
at PreferencesActivity$2.afterTextChanged(PreferencesActivity.java:118)
at android.widget.TextView.sendAfterTextChanged(TextView.java:7689)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:9482)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:972)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:516)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:216)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:33)
at android.view.inputmethod.BaseInputConnection.deleteSurroundingText(BaseInputConnection.java:244)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:389)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5247)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)
第118行是:
@凌驾
public void afterTextChanged(Editable editable) {
try {
seekbarPrice.setProgress(Integer.parseInt(editable.toString()));
} catch (Exception ex) {
}
updateText();
}
});
updateText()是第118行。这是edittext的一部分,我会删除该值。如果您尝试设置
int
值,我会尝试搜索资源,因此尝试将其转换为字符串并在TextView中设置它将起作用
有两种方法,一种是TextView.setText(CharSequence text)
,第一种方法将指向资源id,您给出了int
,因此它试图在资源中搜索该int值
这样设置,
setText(String.valueOf((Integer.parseInt(EditTextA.getText().toString())) + (Integer.parseInt(EditTextB.getText().toString()) + (Integer.parseInt(EditTextC.getText().toString()) + (Integer.parseInt(EditTextD.getText().toString())));
对于每个SeekBar,请按如下步骤在布尔值上创建
private boolean isChangeByProgressBarA = false;
private void updateText() {
setText(String.valueOf((Integer.parseInt(EditTextA.getText().toString())) + (Integer.parseInt(EditTextB.getText().toString()) + (Integer.parseInt(EditTextC.getText().toString()) + (Integer.parseInt(EditTextD.getText().toString())));
}
seekbarPrice.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
if(isChangeByProgressBarA) {
valuePrice.setText(String.valueOf(seekBar.getProgress()));
}
updateText();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isChangeByProgressBarA = true;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
isChangeByProgressBarA = false;
}
});
valuePrice.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
try {
if(!TextUtils.isEmpty(editable.toString())) {
seekbarPrice.setProgress(Integer.parseInt(editable.toString()));
}
} catch (Exception ex) {
}
updateText();
}
});
对所有文本执行此操作,或者您可以放置单个侦听器并根据Id进行检查。我尝试了此操作,虽然它修复了错误,但TextView的编号为0,并且在我更改EditText和SeekBar时,它根本没有改变……谢谢!我会试试这个,并尽快报告!当然,如果你有任何问题,请告诉我。它成功了!谢谢我没有使用布尔值&没有对seekbar代码进行任何更改,因为我发现edittext代码本身已经更改了seekbar,反之亦然,因此如果seekbar被更改,它将更改edittext并调用updatetext函数再次验证代码,您可能会得到循环方法。