Странное поведение TextInputEditText, если подключен onFocusChangeListener - PullRequest
0 голосов
/ 10 января 2019

У меня есть два 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, который находится в моей раскладке, исчезал, поэтому пользователь мог видеть другие элементы пользовательского интерфейса, расположенные ниже, в частности кнопки).

Кроме того, оба 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 голосов
/ 14 января 2019

Документация для ScrollView.fullScroll () гласит:

Этот метод прокручивает вид сверху или снизу, а дает фокусировку на самый верхний / самый нижний компонент в новой видимой области.

Проблема, вероятно, заключается в том, что первый TextInputEditText является "самым верхним компонентом в новой видимой области" ScrollView, поэтому ему автоматически предоставляется фокус.

Возможные решения могут быть:

  • Вместо 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
    
...