如何将焦点更改为android中的下一个编辑文本?

时间:2013-10-18 06:00:18

标签: android android-edittext

enter image description here

用户只能在编辑文本中输入一位数字。如果他在edtText1中输入值,我希望光标自动移动到edtText2,依此类推。用户可以编辑他/她已经输入的文本。我尝试了以下方式。

    edtPasscode1.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            if (edtPasscode1.getText().length() == 1)
                edtPasscode2.requestFocus();
            return false;
        }
    });

    edtPasscode2.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            if (edtPasscode2.getText().length() == 1)
                edtPasscode3.requestFocus();
            return false;
        }
    });

    edtPasscode3.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            if (edtPasscode3.getText().length() == 1)
                edtPasscode4.requestFocus();
            return false;
        }
    });

如果用户编辑文本,光标将移动到其他一些editTexts,并且无法正常工作。我怎样才能实现上述目标?

9 个答案:

答案 0 :(得分:32)

尝试 TextWatcher 而不是 onKeyListener

B'coz如果想要编辑密码,那么 TextWatcher 将为您提供更多处理方法..

<强>编辑: -

StringBuilder sb=new StringBuilder();

         edtPasscode1.addTextChangedListener(new TextWatcher() {
             public void onTextChanged(CharSequence s, int start, int before, int count) {
                 // TODO Auto-generated method stub
                 if(sb.length()==0&edtPasscode1.length()==1)
                 {
                     sb.append(s);
                     edtPasscode1.clearFocus();
                     edtPasscode2.requestFocus();
                     edtPasscode2.setCursorVisible(true);

                 }
             }

             public void beforeTextChanged(CharSequence s, int start, int count,
                     int after) {

                 if(sb.length()==1)
                 {

                     sb.deleteCharAt(0);

                 }

             }

             public void afterTextChanged(Editable s) {
                 if(sb.length()==0)
                 {

                     edtPasscode1.requestFocus();
                 }

             }
         });

希望这项工作。

答案 1 :(得分:5)

android:maxLength="1"设置为xml

中的所有ExitText

尝试以下代码

edtxt1 = (EditText) findViewById(R.id.edtxt_phonenumber_one);
        edtxt2 = (EditText) findViewById(R.id.edtxt_phonenumber_two);
        edtxt3 = (EditText) findViewById(R.id.edtxt_phonenumber_three);

        edtxt1.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {

                if (s.length() ==1) {
                    edtxt2.requestFocus();
                }

            }

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

            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }
        });

        edtxt2.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {
                if (s.length() == 1) {
                    edtxt3.requestFocus();
                }

            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

            }
        });
        edtxt3.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {
                if (s.length() == 1) {
                    edtxt1.requestFocus();
                }

            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

            }
        });

这应该有效

答案 2 :(得分:2)

将编辑文本的长度设置为android:maxLength="1",然后按照以下代码

((EditText) findViewById(R.id.edi1)).addTextChangedListener(new TextWatcher() {
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
            if(((EditText) findViewById(R.id.edi1)).getText().toString().length()==1)
            {
                ((EditText) findViewById(R.id.edi1)).clearFocus();
                ((EditText) findViewById(R.id.edi2)).requestFocus();
                ((EditText) findViewById(R.id.edi2)).setCursorVisible(true);

            }
        }

        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

        }


    });

    ((EditText) findViewById(R.id.edi2)).addTextChangedListener(new TextWatcher() {
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
            if(((EditText) findViewById(R.id.edi2)).getText().toString().length()==1)
            {
                ((EditText) findViewById(R.id.edi2)).clearFocus();
                ((EditText) findViewById(R.id.edi3)).requestFocus();
                ((EditText) findViewById(R.id.edi3)).setCursorVisible(true);

            }
        }

        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

        }


    });


    ((EditText) findViewById(R.id.edi3)).addTextChangedListener(new TextWatcher() {
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
            if(((EditText) findViewById(R.id.edi3)).getText().toString().length()==1)
            {
                ((EditText) findViewById(R.id.edi3)).clearFocus();
                ((EditText) findViewById(R.id.edi4)).requestFocus();
                ((EditText) findViewById(R.id.edi4)).setCursorVisible(true);

            }
        }

        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

        }


    });

答案 3 :(得分:2)

首先在这里设置EditText max length=1,我在xml文件中使用了三个EditText

<EditText
    android:id="@+id/edt1"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:inputType="number"
    android:textAlignment="center"
    android:singleLine="true"
    android:maxLength="1"
    android:maxLines="1"
    android:imeOptions="actionNext"
    android:layout_margin="5dp"
    android:background="@drawable/edittext_shape_bg"/>


<EditText
    android:id="@+id/edt2"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:inputType="number"
    android:textAlignment="center"
    android:singleLine="true"
    android:maxLength="1"
    android:imeOptions="actionNext"
    android:maxLines="1"
    android:layout_margin="5dp"
    android:background="@drawable/edittext_shape_bg"/>

<EditText
    android:id="@+id/edt3"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:inputType="number"
    android:textAlignment="center"
    android:singleLine="true"
    android:maxLength="1"
    android:imeOptions="actionNext"
    android:maxLines="1"
    android:layout_margin="5dp"
    android:background="@drawable/edittext_shape_bg"/>

然后在每个addTextChangeListener中实施EditText,以帮助您前进和后退。

在这里,我们使用StringBuilder来获取最终字符串值。

edt1.addTextChangedListener(new TextWatcher() {
      @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) {
          String edtChar=edt1.getText().toString();
          if(edtChar.length()==1)
          {
              currentCode.append(edtChar);

              edt2.requestFocus();
          }else if(edtChar.length()==0) {
            currentCode.deleteCharAt(0);
              edt1.requestFocus();
          }


      }
  });


    edt2.addTextChangedListener(new TextWatcher() {
        @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) {
            String edtChar=edt2.getText().toString();
            if(edtChar.length()==1)
            {
                currentCode.append(edtChar);

                edt3.requestFocus();
            }else if(edtChar.length()==0) {
                currentCode.deleteCharAt(1);
                edt1.requestFocus();
            }


        }
    });
    edt3.addTextChangedListener(new TextWatcher() {
        @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) {
            String edtChar=edt3.getText().toString();
            if(edtChar.length()==1)
            {
                currentCode.append(edtChar);

                edt4.requestFocus();
            }else if(edtChar.length()==0) {
                currentCode.deleteCharAt(2);
                edt2.requestFocus();
            }


        }
    });

答案 4 :(得分:0)

这适用于我的情况,编辑文本的max_length也应为1.

postBoard

答案 5 :(得分:0)

我也遇到了同样的问题,我只是简单地解决了这个问题。 使用.xml文件。使用 android:nextFocusDown =“ next_EditText_id”

例如:

<EditText
       android:id="@+id/edtUsername"
       android:nextFocusDown="@id/edtPassword"
       style="@style/EditText"
       />

<EditText
       android:id="@+id/edtPassword"
       style="@style/EditText.Password"
       />

答案 6 :(得分:0)

我的kotlin解决方案

private fun addEditTextListener(editText: EditText?, nextEditText: EditText?) {
    editText?.setOnFocusChangeListener { view, focused ->
        if (focused) {
            editText.text = null
        }
    }
    editText?.addTextChangedListener {
        if (it.toString().isNotEmpty()) {
            if (nextEditText != null) {
                nextEditText.requestFocus()
            } else {
                viewModel.confirmCode(
                    binding?.digit1?.text?.toString(),
                    binding?.digit2?.text?.toString(),
                    binding?.digit3?.text?.toString(),
                    binding?.digit4?.text?.toString(),
                )
            }
        }

    }
}

并设置监听器

 override fun setupViews() {
    addEditTextListener(binding?.digit1, binding?.digit2)
    addEditTextListener(binding?.digit2, binding?.digit3)
    addEditTextListener(binding?.digit3, binding?.digit4)
    addEditTextListener(binding?.digit4, null)
}

答案 7 :(得分:-1)

您可以使用隐藏的 EditText 接收输入,四个 TextView 来显示密码。

示例:

<强> dialog_passworld.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="10dip"
    android:paddingLeft="20dip"
    android:paddingRight="20dip"
    android:paddingTop="10dip" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Please enter a password"
        android:textSize="16sp" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="40dip"
        android:layout_marginTop="15dip" >

        <EditText
            android:id="@+id/passcode"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <LinearLayout
            android:id="@+id/passcode_container"
            android:layout_width="match_parent"
            android:layout_height="40dip"
            android:background="@drawable/password_border" >

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="center"
                android:textSize="18sp"
                android:textStyle="bold" />

            <View
                android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="@android:color/darker_gray" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="center"
                android:textSize="16sp"
                android:textStyle="bold" />

            <View
                android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="@android:color/darker_gray" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="center"
                android:textSize="16sp"
                android:textStyle="bold" />

            <View
                android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="@android:color/darker_gray" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="center"
                android:textSize="16sp"
                android:textStyle="bold" />
        </LinearLayout>
    </FrameLayout>

</LinearLayout>

<强> PasswordDialogBu​​ilder.java

public class PasswordDialogBuilder extends AlertDialog.Builder {

    public PasswordDialogBuilder(Context context) {
        super(context, displayMetrics, eventManager);

        View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_password, null);

        LinearLayout passcodeContainer = (LinearLayout) contentView.findViewById(R.id.passcode_container);

        final List<TextView> passwordViews = new ArrayList<TextView>();

        int childCount = passcodeContainer.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View childView = passcodeContainer.getChildAt(i);
            if (childView instanceof TextView) {
                passwordViews.add((TextView) childView);
            }
        }

        final int passwordCount = passwordViews.size();

        EditText passwordView = (EditText) contentView.findViewById(R.id.passcode);
        passwordView.setFilters(new InputFilter[] {new InputFilter.LengthFilter(passwordCount)});
        passwordView.setInputType(EditorInfo.TYPE_CLASS_NUMBER);
        passwordView.setCursorVisible(false);
        passwordView.setTextColor(Color.TRANSPARENT);
        passwordView.setBackgroundColor(Color.TRANSPARENT);
        passwordView.setSingleLine();

        passwordView.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}

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

            @Override
            public void afterTextChanged(Editable s) {
                int passwordLength = s.length();

                for (int i = 0; i < passwordCount; i++) {
                    TextView passcodeView = passwordViews.get(i);
                    if (i < passwordLength) {
                        passcodeView.setText(String.valueOf(s.charAt(i)));
                    } else {
                        passcodeView.setText(StringUtils.EMPTY);
                    }
                }

                if (positiveButton != null) {
                    positiveButton.setEnabled(passwordLength == passwordCount);
                }
            }
        });

        setView(contentView);
    }
}

答案 8 :(得分:-1)

解决方案编码没问题,

下面的代码表示自动移动到下一个编辑文本并自动移动到上一个编辑文本。

如果你在下面使用 Rxjava + Data Binding + RxBinding ,也没关系:

// Show button Active code when enough fields active code
    Observable<Boolean> mObsPhoneVerify1 = RxTextView.textChanges(db.etPhoneVerify1)
            .observeOn(AndroidSchedulers.mainThread())
            .map(charSequence -> {
                if (!charSequence.toString().equals("")) {
                    db.etPhoneVerify2.requestFocus();
                    return true;
                } else {
                    db.etPhoneVerify1.requestFocus();
                    return false;
                }
            });
    Observable<Boolean> mObsPhoneVerify2 = RxTextView.textChanges(db.etPhoneVerify2)
            .observeOn(AndroidSchedulers.mainThread())
            .map(charSequence -> {
                if (!charSequence.toString().equals("")) {
                    db.etPhoneVerify3.requestFocus();
                    return true;
                } else {
                    db.etPhoneVerify1.requestFocus();
                    return false;
                }
            });
    Observable<Boolean> mObsPhoneVerify3 = RxTextView.textChanges(db.etPhoneVerify3)
            .observeOn(AndroidSchedulers.mainThread())
            .map(charSequence -> {
                if (!charSequence.toString().equals("")) {
                    db.etPhoneVerify4.requestFocus();
                    return true;
                } else {
                    db.etPhoneVerify2.requestFocus();
                    return false;
                }
            });
    Observable<Boolean> mObsPhoneVerify4 = RxTextView.textChanges(db.etPhoneVerify4)
            .observeOn(AndroidSchedulers.mainThread())
            .map(charSequence -> {
                if (!charSequence.toString().equals("")) {
                    hideKeyboard();
                    return true;
                } else {
                    /*
                    If enough text for  all fields, no need cursor
                    Otherwise, focus previous edit text
                     */
                    if (Utils.isValidEditText(db.etPhoneVerify1) && Utils.isValidEditText(db.etPhoneVerify2) && Utils.isValidEditText(db.etPhoneVerify3)) {
                        db.etPhoneVerify3.requestFocus();
                    } else {
                        db.etPhoneVerify1.clearFocus();
                        db.etPhoneVerify2.clearFocus();
                        db.etPhoneVerify3.clearFocus();
                        db.etPhoneVerify4.clearFocus();
                    }
                    return false;
                }
            });

   disposable = Observable
            .combineLatest(mObsPhoneVerify1, mObsPhoneVerify2, mObsPhoneVerify3, mObsPhoneVerify4,
                    (PhoneVerify1, PhoneVerify2, PhoneVerify3, PhoneVerify4)
                            -> PhoneVerify1 && PhoneVerify2 && PhoneVerify3 && PhoneVerify4)
            .compose(regisObserver(false))
            .subscribe(aBoolean -> {
                db.btnActiveCode.setEnabled(aBoolean);
            });