如何在android中使用Textwatcher更新两个Edittext Parraley?
您好,我面临一个多编辑文本并行更新的问题。如果我在第一个编辑文本中输入值,第二个编辑文本将更改。在第二个编辑文本中也是如此。但编辑文本中光标的键侦听器存在问题。我无法获取光标。如何解决此问题?我不知道您正在做(或试图做)什么。如何在android中使用Textwatcher更新两个Edittext Parraley?,android,android-edittext,keylistener,textwatcher,Android,Android Edittext,Keylistener,Textwatcher,您好,我面临一个多编辑文本并行更新的问题。如果我在第一个编辑文本中输入值,第二个编辑文本将更改。在第二个编辑文本中也是如此。但编辑文本中光标的键侦听器存在问题。我无法获取光标。如何解决此问题?我不知道您正在做(或试图做)什么。 在onTextChangedfortext1中,您正在触发onTextChangedfortext2。这里似乎触发了无限文本更改侦听器。 正在发生的事情的逻辑-> 假设用户将字符1输入text1总计现在为2。现在您将text2设置为total,即2。这反过来会触发text
在
onTextChanged
fortext1
中,您正在触发onTextChanged
fortext2
。这里似乎触发了无限文本更改侦听器。正在发生的事情的逻辑->
假设用户将字符
1
输入text1
<代码>总计现在为2
。现在您将text2
设置为total
,即2
。这反过来会触发text2
的文本更改侦听器。现在total
是2
+2=4
。现在将4
设置为text1
的文本。这反过来会触发text1
的文本更改侦听器对我来说似乎是一个永无止境的循环。这就是你得到一个
StackOverflow
错误(lol)的原因。你到底想做什么
我不太确定是什么解决了这个问题(我手头没有Android Studio的工作副本),但将块移动到PostTextChanged
可能会解决这个问题。你可以这样试试。TextWatcher将通过处理程序通过方法afterTextChanged将值更新为second EditText
public class SampleActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_datepicker);
final EditText text1 = (EditText) findViewById(R.id.text1);
final EditText text2 = (EditText) findViewById(R.id.text2);
text1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
try {
int total = Integer.parseInt(s.toString()) + 1;
text2.setText(String.valueOf(total));
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable s) {
}
});
text2.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
try {
int total = Integer.parseInt(s.toString()) + 2;
text1.setText(String.valueOf(total));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
}
处理程序将用于更新second EditText中的文本
EditText text1;
StringBuffer previousChar=new StringBuffer();
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
text1=(EditText)findViewById(R.id.editText);
text1.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) {
if(!previousChar.toString().equals(s.toString())){
Message msg=new Message();
msg.obj=s.toString();
localHandler.sendMessage(msg);
previousChar=new StringBuffer(s.toString());
Log.i("TAG", "TextEntered = "+s);
}
}
});}
这将给出我想要的解决方案。光标在每个edittext中移动时,我会得到值。当第一个edittext处于有效模式时,删除另一个edittext的TextChangeListener,并在文本更改后添加它
includeTW = new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if(!(includedText.getText().toString().equals("")))
{
excludedText.removeTextChangedListener(excludeTW);
String included = includedText.getText().toString();
excludedText.setText(included); //////// Error Line
excludedText.addTextChangedListener(excludeTW);
}
}
};
excludeTW = new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!(excludedText.getText().toString().equals(""))) {
includedText.removeTextChangedListener(includeTW);
String excluded = excludedText.getText().toString();
includedText.setText(excluded);
includedText.addTextChangedListener(includeTW);
}
}
};
includedText.addTextChangedListener(includeTW) ;
excludedText.addTextChangedListener(excludeTW);
你的意思是光标没有更新是的,你是对的,我得到了stackoverflow错误。
includeTW = new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if(!(includedText.getText().toString().equals("")))
{
excludedText.removeTextChangedListener(excludeTW);
String included = includedText.getText().toString();
excludedText.setText(included); //////// Error Line
excludedText.addTextChangedListener(excludeTW);
}
}
};
excludeTW = new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!(excludedText.getText().toString().equals(""))) {
includedText.removeTextChangedListener(includeTW);
String excluded = excludedText.getText().toString();
includedText.setText(excluded);
includedText.addTextChangedListener(includeTW);
}
}
};
includedText.addTextChangedListener(includeTW) ;
excludedText.addTextChangedListener(excludeTW);
public class SampleActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_datepicker);
final EditText text1 = (EditText) findViewById(R.id.text1);
final EditText text2 = (EditText) findViewById(R.id.text2);
text1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
**text2.addTextChangedListener(null);**
try {
int total = Integer.parseInt(s.toString()) + 1;
text2.setText(String.valueOf(total));
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable s) {
**text2.addTextChangedListener(this);**
}
});
text2.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
text1.addTextChangedListener(null);
try {
int total = Integer.parseInt(s.toString()) + 2;
text1.setText(String.valueOf(total));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s)
{
**text1.addTextChangedListener(this);**
}
});
}
}