40

1行にいくつかの編集テキストボックスがあります。ユーザーが最初に特定の文字数を入力した後、次の編集テキストに自動的に移動したいと思います。どうすればこれを達成できますか?

4

4 に答える 4

75

これは、クラスを使用して、TextWatcherのメソッドでText Watcher次のクラスにフォーカスを設定することで実現できます。EditTextOnTextChanged()

あなたの場合、2つの編集テキストがあるので、と言っet1et2ください。次のコードを試すことができます:-

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
    }

});

私は自分でコードをチェックアウトしていませんが、これが問題の解決に役立つことを願っています。

于 2012-09-18T04:20:32.823 に答える
23

EditTextビューのIDの知識を必要としない、これを行うためのより簡単な方法があります。android:maxLength="1"で使用します。

// onTextChanged
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
    TextView text = (TextView)getCurrentFocus();

    if (text != null && text.length() > 0)
    {
        View next = text.focusSearch(View.FOCUS_RIGHT); // or FOCUS_FORWARD
        if (next != null)
            next.requestFocus();

        doSearch(); // Or whatever
    }
}

// afterTextChanged
@Override
public void afterTextChanged(Editable s) {}

// beforeTextChanged
@Override
public void beforeTextChanged(CharSequence s, int start,
                              int count, int after) {}
于 2017-01-29T18:46:02.430 に答える
4

受け入れられた答えは良いです。

RxJava + RxBindingライブラリを使用している場合は、新しい方法を提供します。

コーディングは、4つの入力テキストの編集が検証を必要としていることを示しています(私の場合は電話経由のアクティブコードSMS-電話検証)

// Show button Active code when enough fields active code
    Observable<Boolean> mObsPhoneVerify1 = RxTextView.textChanges(db.etPhoneVerify1)
            .observeOn(AndroidSchedulers.mainThread())
            .map(charSequence -> {
                        db.etPhoneVerify2.requestFocus();
                        return charSequence != null && !charSequence.toString().equals("");
                    }
            );
    Observable<Boolean> mObsPhoneVerify2 = RxTextView.textChanges(db.etPhoneVerify2)
            .observeOn(AndroidSchedulers.mainThread())
            .map(charSequence -> {
                db.etPhoneVerify3.requestFocus();
                return charSequence != null && !charSequence.toString().equals("");
            });
    Observable<Boolean> mObsPhoneVerify3 = RxTextView.textChanges(db.etPhoneVerify3)
            .observeOn(AndroidSchedulers.mainThread())
            .map(charSequence -> {
                db.etPhoneVerify4.requestFocus();
                return charSequence != null && !charSequence.toString().equals("");
            });
    Observable<Boolean> mObsPhoneVerify4 = RxTextView.textChanges(db.etPhoneVerify4)
            .observeOn(AndroidSchedulers.mainThread())
            .map(charSequence -> {
                db.etPhoneVerify1.requestFocus();

                hideKeyboard();
                return charSequence != null && !charSequence.toString().equals("");
            });

    disposable = Observable
            .combineLatest(mObsPhoneVerify1, mObsPhoneVerify2, mObsPhoneVerify3, mObsPhoneVerify4,
                    (PhoneVerify1, PhoneVerify2, PhoneVerify3, PhoneVerify4)
                            -> PhoneVerify1 && PhoneVerify2 && PhoneVerify3 && PhoneVerify4)
            .compose(regisObserver(false))
            .subscribe(aBoolean -> {
                db.btnActiveCode.setEnabled(aBoolean);
            });
    busDisposables.add(disposable);
于 2017-04-20T03:29:24.027 に答える
2

フォーカスをシフトしたいTextViewのリストがある場合(OTP入力の取得など)、次のコードはより少ない行数でそれを達成するのに役立ちます

TextView otp1 = (TextView) root.findViewById(R.id.edit_verify_otp1);
TextView otp2 = (TextView) root.findViewById(R.id.edit_verify_otp2);
TextView otp3 = (TextView) root.findViewById(R.id.edit_verify_otp3);
TextView otp4 = (TextView) root.findViewById(R.id.edit_verify_otp4);

/* Assign the TextViews in the array in the order in which you want to shift focus */
TextView[] otpTextViews = {otp1, otp2, otp3, otp4}; 

    for (TextView currTextView : otpTextViews) {
        currTextView.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

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

            @Override
            public void afterTextChanged(Editable s) {
            }

            public TextView nextTextView() {
                int i;
                for (i = 0; i < otpTextViews.length - 1; i++) {
                    if (otpTextViews[i] == currTextView)
                        return otpTextViews[i + 1];
                }
                return otpTextViews[i];
            }
        });
    }
于 2020-08-25T23:17:03.783 に答える