我正在根据用户输入以编程方式创建可变数量的EditText,每个EditText
与另一个配对(因此,我创建的数量是用户要求的两倍)。当用户将值更改为1时,我希望匹配的配对EditText
也要更改。
我有一个循环,该循环遍历带有所有editTexts的数组,并为每个editTexts创建一个TextWatcher
,但是当我尝试更改onTextChanged
方法中的文本时,程序崩溃。
for(int i = 0; i < waysToSplit; i++)
{
editTexts[i] = new EditText(this);
editTexts[i+waysToSplit] = new EditText(this); //The paired edittext
editTexts[i].setId(i+1);
editTexts[i].addTextChangedListener(new TextWatcher(){
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Change the paired box
editTexts[i+waysToSplit].setText("changed");
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
}
不仅不会让我在onTextChanged方法内使用变量i(“无法在用其他方法定义的内部类中引用非最终变量”),而且即使出于测试目的,我也会尝试创建一个特定的用类似的东西改变盒子
editTexts[3].setText("Changed");
什么都没发生。
希望这是足够的代码来了解发生了什么。我能找到的最接近的是Android: Two EditTexts dependent on each other,但是那里没有任何代码。
最佳答案
您只需要将配对的EditText
拉出到单独的声明中即可。然后,您可以将其标记为final
,并在您的侦听器中对其进行访问。
for(int i = 0; i < waysToSplit; i++)
{
editTexts[i] = new EditText(context);
final EditText paired = new EditText(context);//The paired edittext
editTexts[i+waysToSplit] = paired;
editTexts[i].setId(i+1);
editTexts[i].addTextChangedListener(new TextWatcher(){
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Change the paired box
paired.setText("changed");
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}