如果挂钩 onFocusChangeListener,TextInputEditText 的奇怪行为

Weird behaviour of TextInputEditText if onFocusChangeListener is hooked

我的 Activity 里有两个 EditText,每个都在 TextInputLayout:

<android.support.design.widget.TextInputLayout
            android:id="@+id/tilm"
            android:layout_width="250dp"
            android:layout_height="50dp"
            android:layout_below="@+id/logo"
            android:layout_marginTop="10dp"
            android:layout_centerHorizontal="true"
            android:textColorHint="#FFFFFF"
            app:hintEnabled="false">

            <android.support.design.widget.TextInputEditText
                android:id="@+id/etlogin"
                android:layout_width="match_parent"
                android:layout_height="match_parent"

                android:background="@drawable/round_edittext"
                android:hint="@string/email"
                android:textColorHint="#FFFFFF"
                android:gravity="center"
                android:padding="5dp"
                android:textColor="#FFFFFF"

                android:inputType="textEmailAddress" />
        </android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
            android:id="@+id/til"
            android:layout_width="250dp"
            android:layout_height="50dp"
            android:layout_below="@+id/tilm"
            android:layout_marginTop="10dp"
            android:layout_centerHorizontal="true"
            app:passwordToggleEnabled="true"
            android:textColorHint="#FFFFFF"
            app:hintEnabled="false">

            <android.support.design.widget.TextInputEditText
                android:id="@+id/etpass"
                android:layout_width="match_parent"
                android:layout_height="match_parent"

                android:background="@drawable/round_edittext"
                android:hint="@string/pass"
                android:textColorHint="#FFFFFF"
                android:gravity="center"
                android:padding="5dp"
                android:textColor="#FFFFFF"

                android:inputType="textPassword" />
        </android.support.design.widget.TextInputLayout>

此外,在代码中,我有相同的 onFocusChangeListener 上钩:

focusChangeListener=new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
                scrollView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        scrollView.fullScroll(ScrollView.FOCUS_DOWN);
                    }
                }, 200);
            }
        }
    };

(这是为了当键盘出现时,我的布局中的 ScrollView 会下降,这样用户就可以看到下方 UI 的其他元素,特别是按钮).

另外,两个 TextInputEditText 都有一个 TextWatcher:

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

        }

        @Override
        public void afterTextChanged(Editable s) {
            if(ValidateLogin(login.getText().toString()) && pass.getText().length()>0){
                entrar.setEnabled(true);//This is a button
            }else{
                if(entrar.isEnabled()){
                    entrar.setEnabled(false);
                }
            }
        }
    };
login.addTextChangedListener(textWatcher);
    pass.addTextChangedListener(textWatcher);
    login.setOnFocusChangeListener(focusChangeListener);
    pass.setOnFocusChangeListener(focusChangeListener);

问题是,当第二个 TextInputEditText 获得焦点时,光标会自动转到第一个,而我无法在第二个中输入任何内容,因为焦点会立即转到第一个.我不希望这种情况发生,让我的 onFocusChangeListener 保持在两个 TextInputEditText 中,并且不要自动更改焦点。

我曾尝试为第二个 TextInputEditText 制作另一个 OnFocusChangeListener,但没有成功。如果我删除 onFocusChangeListener,焦点将保持在 TextInputEditText,但显然 ScrollView 不会移动。

有什么帮助吗?

谢谢。

documentation of ScrollView.fullScroll() 说:

This method will scroll the view to the top or bottom and give the focus to the topmost/bottommost component in the new visible area.

问题可能是第一个 TextInputEditTextScrollView 的 "topmost component in the new visible area",因此它会自动获得焦点。

可能的解决方案可能是:

  • 而不是fullScroll,使用

    int scrollY = Math.max(0, content.getHeight() - scrollView.getHeight()); // where content is the content view of the scroll view
    scrollView.smoothScrollTo(0, scrollY); // or scrollTo if you don't want animation