Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中将焦点更改为下一个编辑文本?_Android_Android Edittext - Fatal编程技术网

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

如何在android中将焦点更改为下一个编辑文本?,android,android-edittext,Android,Android Edittext,用户只能在编辑文本中输入一位数字。如果他在edtText1中输入值,我希望光标自动移动到edtText2,依此类推。用户可以编辑他/她已经输入的文本。我试着用下面的方法 edtPasscode1.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Au

用户只能在编辑文本中输入一位数字。如果他在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;
        }
    });

如果用户编辑文本,光标将移动到其他一些编辑文本,并且无法按需要工作。如何实现上述目标?

尝试TextWatcher而不是onKeyListener

因为如果你想编辑你的密码,在这种情况下,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();
                 }

             }
         });

希望这能奏效。

将editeText的长度设置为
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

        }


    });

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

            }
        });

这应该可以使用

您可以使用隐藏的编辑文本接收输入,四个文本视图来显示密码

例如:

对话框\u passworld.xml


PasswordDialogBuilder.java

公共类PasswordDialogBuilder扩展了AlertDialog.Builder{
公共密码对话框生成器(上下文){
超级(上下文、displayMetrics、eventManager);
查看contentView=LayoutInflater.from(上下文)。充气(R.layout.dialog\u密码,null);
LinearLayout passcodeContainer=(LinearLayout)contentView.findviewbyd(R.id.passcode\u容器);
最终列表密码视图=新的ArrayList();
int childCount=passcodeContainer.getChildCount();
for(int i=0;i
解决方案编码正常

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

如果您在下面使用Rxjava+数据绑定+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);
            });
//当有足够的字段激活代码时显示按钮激活代码
Observable mObsPhoneVerify1=RxTextView.textChanges(db.etPhoneVerify1)
.observeOn(AndroidSchedulers.mainThread())
.map(字符序列->{
如果(!charSequence.toString().equals(“”){
db.etPhoneVerify2.requestFocus();
返回true;
}否则{
db.etPhoneVerify1.requestFocus();
返回false;
}
});
可观察的mObsPhoneVerify2=RxTextView.textChanges(db.etPhoneVerify2)
.observeOn(AndroidSchedulers.mainThread())
.map(字符序列->{
如果(!charSequence.toString().equals(“”){
db.etPhoneVerify3.requestFocus();
返回true;
}否则{
db.etPhoneVerify1.requestFocus();
返回false;
}
});
Observable mObsPhoneVerify3=RxTextView.textChanges(db.etPhoneVerify3)
.observeOn(AndroidSchedulers.mainThread())
.map(字符序列->{
如果(!charSequence.toString().equals(“”){
db.etPhoneVerify4.requestFocus();
返回true;
}否则{
db.etPhoneVerify2.requestFocus();
返回false;
}
});
Observable mObsPhoneVerify4=RxTextView.textChanges(db.etPhoneVerify4)
.observeOn(AndroidSchedulers.mainThread())
.map(字符序列->{
如果(!charSequence.toString().equals(“”){
隐藏板();
返回true;
}否则{
/*
如果所有字段都有足够的文本,则不需要光标
否则,聚焦上一个编辑文本
*/
if(Utils.isvaliditext(db.etPhoneVerify1)和&Utils.isvaliditext(db.etPhoneVerify2)和&Utils.isvaliditext(db.etPhoneVerify3)){
db.etPhoneVerify3.requestFocus();
}否则{
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);
    }
}
// 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);
            });
otp_1.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) {
                //
                if(editable.length()>0){
                    otp_1.clearFocus();
                    otp_2.requestFocus();
                    otp_2.setCursorVisible(true);
                }
            }
        });

        otp_2.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) {
                //
                if(editable.length() > 0) {
                    otp_2.clearFocus();
                    otp_3.requestFocus();
                    otp_3.setCursorVisible(true);
                }
            }
        });

        otp_3.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) {
                if(editable.length() > 0) {
                    otp_3.clearFocus();
                    otp_4.requestFocus();
                    otp_4.setCursorVisible(true);
                }
            }
        });
<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"/>
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();
            }


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

<EditText
       android:id="@+id/edtPassword"
       style="@style/EditText.Password"
       />
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)
}