达到最大编辑文本长度后,编辑文本会跳至下一个编辑文本

时间:2018-11-01 18:21:49

标签: java android android-edittext

我的问题与这篇文章非常相似:Edittext jumps to next edittext after reaching the maximum edittext length

但是,无论我做什么,我都无法跳过下图所示的第三个edittext。我在第一个编辑文本中写入10,它会自动移动到第二个编辑文本,但是当我写12时,它不会移动到第三个编辑文本。我尝试了几件事,但无法处理。对于这个问题,我需要一个简单的解决方案,最多10-15个edittext。有人可以帮我了解语法吗?谢谢。

enter image description here

这是我的活动主要xml

<EditText
    android:id="@+id/edittext1"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:maxLength="2"
    android:hint="1"
    android:layout_weight="1"/>
<EditText
    android:id="@+id/edittext2"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:maxLength="2"
    android:digits="0123456789 "
    android:hint="2"
    android:layout_weight="1"/>
<EditText
    android:id="@+id/edittext3"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:maxLength="2"
    android:digits="0123456789 "
    android:hint="3"
    android:layout_weight="1"/>

这是我的主要活动

package com.example.serkan.justtry;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity implements TextWatcher {
    EditText edt1;
    EditText edt2;
    EditText edt3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    edt1=(EditText)findViewById(R.id.edittext1);
    edt2=(EditText)findViewById(R.id.edittext2);
    edt3=(EditText)findViewById(R.id.edittext3);

    edt1.addTextChangedListener(this);
}

@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) {
    if (edt1.length() == 2) {
        edt2.requestFocus();
    }
}
}

4 个答案:

答案 0 :(得分:0)

您还需要将列表器设置为edt2

    edt2.addTextChangedListener(this);

只需替换

    @Override
    public void afterTextChanged(Editable editable) {

        if(edt1.getText().hashCode() == editable.hashCode()){
            if (edt1.length() == 2) {
                edt2.requestFocus();
            }
        }
        else if( edt2.getText().hashCode() == editable.hashCode()){
            if (edt2.length() == 2) {
                edt3.requestFocus();
            }
        }
    }

答案 1 :(得分:0)

您没有将TextChangedListener设置为其他2个EditText。 收听者不知道何时必须将焦点从edt2更改为edt3

将侦听器添加到edt2上的onCreate

edt2.addTextChangedListener(this);

并更新afterTextChanged

@Override
public void afterTextChanged(Editable editable) {

    if (editable == edt1.getEditableText()) {
        if (edt1.length() == 2) {
            edt2.requestFocus();
        }
    } else if (editable == edt2.getEditableText()) {
        if (edt2.length() == 2) {
            edt3.requestFocus();
        }
    }
}

我没有测试。 :)

答案 2 :(得分:0)

将此添加为“活动”中的内部类:

private class MyTextWatcher implements TextWatcher {

    private final int maxLength;
    private final EditText next;

    MyTextWatcher(int maxLength, int nextId) {
        this.maxLength = maxLength;
        this.next = (nextId != -1) ? findViewById(nextId) : null;
    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (editable.length() >= maxLength && next != null) {
            next.requestFocus();
        }
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        // do nothing
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        // do nothing
    }
}

然后为每个EditText进行设置,如下所示:

edittext1.addTextChangedListener(new MyTextWatcher(2, edittext1.getNextFocusDownId()));
edittext2.addTextChangedListener(new MyTextWatcher(2, edittext2.getNextFocusDownId()));
edittext3.addTextChangedListener(new MyTextWatcher(2, edittext3.getNextFocusDownId()));

这取决于在布局中设置nextFocusDown属性:

<EditText
    android:id="@+id/edittext1"
    android:nextFocusDown="@+id/edittext2"
    .../>

答案 3 :(得分:0)

XML文件中没有问题。 只需尝试在MainActivity.java中遵循以下代码

  1. 将TextChangedListener添加到第二个edittext

    edt2.addTextChangedListener(this);

  2. 在textwatcher的onTextChanged方法中插入以下代码

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
    }
    
    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if(edt1.hasFocus())
        {
            if(edt1.getText().toString().length()==2)     //size as per your requirement
            {
                edt2.requestFocus();
            }
        }
        if(edt2.hasFocus())
        {
            if(edt2.getText().toString().length()==2)     //size as per your requirement
            {
                edt3.requestFocus();
            }
        }
    
    }
    
    @Override
    public void afterTextChanged(Editable editable) {
    
    }
    

我希望这个答案能解决您的问题:)