移动到android中的下一个EditText

时间:2012-09-19 04:27:17

标签: android

根据How to automatically move to the 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
    }

});

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

10 个答案:

答案 0 :(得分:29)

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

android:imeOptions="actionNext"

答案 1 :(得分:15)

如果你想在下一个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"/>

答案 2 :(得分:9)

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

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

对我有用:

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);

答案 5 :(得分:1)

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

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

                   et2.requestFocus();
        }
        else
         {
         }
    }

答案 6 :(得分: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;
            }
        });

答案 7 :(得分: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);
  }

答案 8 :(得分:0)

这是我在recyclerview或listview或任何其他视图中使用editext的方法。

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
}

答案 9 :(得分:-4)

我有一个非常简单的解决方案,只需在xml edittext控件中添加以下属性

<强>机器人:的inputType =&#34; textPersonName&#34;