32

根据发布的问题和答案How to automatically move to next edit text in android,我使用代码移动到下一个编辑框。

et1.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, int start,int before, int count) 
    {
        // TODO Auto-generated method stub
        if(et1.getText().toString().length()==size)     //size as per your requirement
        {
            et2.requestFocus();
        }
    }
    public void beforeTextChanged(CharSequence s, int start,
                    int count, int after) {
                // TODO Auto-generated method stub

    }

    public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
    }

});

我面临的问题是,如果我输入错误,那么即使用户明确请求 focus ,由于文本观察器中的代码,文本框也会移动到下一个。我能做些什么来防止这种情况发生吗?

4

10 回答 10

37

可能为时已晚,但我有一个更容易应用的解决方案。只需将此代码添加到 layout.xml 文件中的 edittext 字段即可。将此添加到要显示下一步按钮而不是完成按钮的edittext 。所以它将指向下一个 Edittext 字段。

android:imeOptions="actionNext"
于 2013-10-31T09:15:20.913 回答
21

如果您想将下一个 EditText 聚焦在按下回车键上,您可以在 XML 代码中使用这些选项来聚焦下一个 EditText:

选项1:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionNext"
    android:singleLine="true"/>

选项 2:

<EditText
    android:id="@+id/et1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:nextFocusForward="@+id/et2"/>

<EditText
    android:id="@+id/et2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"/>
于 2015-05-20T08:18:20.740 回答
13

您可以检查为第一个 EditText 按下的键,如果它是“Enter”键,则将焦点移到下一个 EditText。

这可能会对您有所帮助:KeyCode_Enter to next edittext

于 2012-09-19T04:39:05.180 回答
6

您需要验证用户输入以满足您的期望。如果满足,那么只调用et2.requestFocus()

于 2012-09-19T04:41:43.453 回答
4

它对我有用:

final EditText code1=((EditText)view.findViewById(R.id.code1));
    final EditText code2=((EditText)view.findViewById(R.id.code2));
    final EditText code3=((EditText)view.findViewById(R.id.code3));
    final EditText code4=((EditText)view.findViewById(R.id.code4));



    OnKeyListener key=new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if(!((EditText) v).toString().isEmpty())
            v.focusSearch(View.FOCUS_RIGHT).requestFocus();

            return false;
        }
    };




    code1.setOnKeyListener(key);
    code2.setOnKeyListener(key);
    code3.setOnKeyListener(key);
于 2013-10-25T18:51:40.817 回答
2

您还可以检查您的 if 条件是否正确。

if(et1.getText().toString().length()==size)     //size as per your requirement
    {
        if(et1.gettext.toString().equals(somethingwhichyouhavecheck))
        {

                   et2.requestFocus();
        }
        else
         {
         }
    }
于 2012-09-19T04:31:33.490 回答
1

此代码按预期工作。

etFName.setOnKeyListener(new OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if(etFName.getText().toString().length()==4 && keyCode == KeyEvent.KEYCODE_BACK)
                {
                    typinget1 = true;
                }
                else if(etFName.getText().toString().length()==4 && typinget1==true)     //size as per your requirement
                {
                    typinget1 = false;
                    etLName.requestFocus();

                }
                else if(etFName.getText().toString().length()<=4 && typinget1==false)
                {
                    typinget1 = true;

                }

                return false;
            }
        });
于 2012-09-19T06:28:05.677 回答
0

这段代码对我有用

      private void managePinView(final ArrayList<MaterialEditText> editTexts) {
    last = editTexts.size();
    last--;
    editTexts.get(0).requestFocus();
    for (int i = 0; i < editTexts.size(); i++) {
      final int finalI = i;

      editTexts.get(finalI).addTextChangedListener(new TextWatcher() {

        public void onTextChanged(CharSequence s, int start, int before,
                                  int count) {
          convertText(editTexts.get(finalI), s, this); // i can use this function to change english number to persian number if do not use comment this
          int textLength = editTexts.get(finalI).getText().length();
          next = finalI + 1;
          previous = finalI - 1;
          if (textLength >= 1) {
            if (next <= last)
              editTexts.get(next).requestFocus();
          } else {
            if (previous >= 0) {
              editTexts.get(previous).requestFocus();
            }
          }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
        }
      });
    }
  }

  private void convertText(MaterialEditText editText, CharSequence charSequence, TextWatcher watcher) {
    String updatedString = G.convertEnNumberToFi("" + editText.getText().toString().substring(0, editText.length()));
    editText.removeTextChangedListener(watcher);
    editText.setText(updatedString);
    editText.setSelection(charSequence.length());
    editText.addTextChangedListener(watcher);
  }
于 2019-03-14T07:18:41.440 回答
0

这是我在 recyclerview 或 listview 中编辑文本的方法。

edittext.setOnEditorActionListener { textView, actionId, _ ->
     if (actionId == EditorInfo.IME_ACTION_NEXT) {
        var view = textView.focusSearch(View.FOCUS_DOWN)
        while (view != null) {
          if (view is EditText) {
             view.isCursorVisible = true
             return@setOnEditorActionListener view.requestFocus()
          }
          view = view.focusSearch(View.FOCUS_DOWN)
        }
     }
     false
}
于 2019-12-08T08:38:49.297 回答
-4

我对此有非常简单的解决方案,只需将以下属性放在 xml edittext 控件中

android:inputType="textPersonName"

于 2015-01-31T20:36:03.897 回答