如何使相互依赖的edittexts使用TextWatcher以编程方式更改彼此的值

时间:2013-10-28 18:06:12

标签: android textview android-edittext

我以编程方式根据用户输入创建可变数量的EditTexts,并且每个EditText与另一个{(1}}配对(因此我创建的数量是用户要求的两倍)。当用户将值更改为1时,我希望匹配的配对EditText也可以更改。

我有一个循环遍历包含所有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,但那里没有任何代码。

1 个答案:

答案 0 :(得分:1)

您只需将配对的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         
            }
    });
}