如果钩住了onFocusChangeListener,则TextInputEditText的异常行为

时间:2019-01-10 08:45:07

标签: android android-textinputedittext onfocuschangelistener

我的EditText中有两个Activity,每个都在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中,并且不要自动更改焦点。

我尝试为第二个OnFocusChangeListener做另一个TextInputEditText,但是没有运气。如果删除onFocusChangeListener,焦点将保持在TextInputEditText中,但是显然ScrollView不会移动。

有帮助吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

documentation of ScrollView.fullScroll()说:

  

此方法会将视图滚动到顶部或底部,并将焦点移至新可见区域中的最顶部/最底部。

问题可能是第一个TextInputEditTextScrollView的“新可见区域中的最顶层组件”,因此会自动为其赋予焦点。

可能的解决方案可能是:

  • 使用{p>代替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