Clearfocus при edittext дважды вызывает onfocuschange на samsung galaxy tab a (android api 24)

В представлении у меня есть LinearLayout, который я хочу свернуть, когда я нажимаю на EditText ниже, а затем развернуть, когда мы расфокусируем.

<EditText
            android:layout_width="1000dp"
            android:layout_height="43dp"
            android:layout_centerVertical="true"
            android:textSize="14.4sp"
            android:gravity="center_vertical"
            android:hint="@string/hint_query"
            android:layout_toEndOf="@+id/searchImage"
            android:id="@+id/searchBoxText"
            android:background="@null"
            android:layout_marginStart="16dp"
            android:inputType="text"
            tools:ignore="Autofill" />

У меня есть onFocusChangeListener, который я реализовал благодаря Android-Annotations.

@FocusChange
void searchBoxText(EditText searchBoxText) {
    Log.d("change focus", "focus has changed with " + searchBoxText.hasFocus());
    if (!searchBoxText.hasFocus()) {
        if(upperView != null)
            upperView.setVisibility(View.VISIBLE);
    } else {
        if(upperView != null)
            upperView.setVisibility(View.GONE);
    }
}

И у меня есть touchListener для родителя, который бросает:

searchBoxText.clearFocus();

когда мы щелкаем вне EditText.

Планшет я нацеливаю этот код на поддержку как максимум API 24. Моя проблема в том, что этот код отлично работает в API 28, но не в API 24, где он дважды генерирует onFocusChange, и я не нашел никаких причин, почему он это делает, или каким-либо способом заставить его работать.

Вы пробовали вызывать requestFocus () в другом представлении, а не вызывать clearFocus ()? stackoverflow.com/questions/14424654/…

Gavin Wright 31.10.2018 13:54

@GavinWright да, я пробовал, но мне больше не на чем сосредоточиться, а upperView - это Linear, поэтому requestFocus на него не стреляет

Florian Saurs 31.10.2018 14:28

Попробуйте это: stackoverflow.com/questions/4828636/…

Gavin Wright 31.10.2018 14:32

@GavinWright, на самом деле это метод, который я использую, за исключением того, что mEditText.clearFocus () дважды вызывает onFocusChange в моем тексте редактирования в API 24, но не в API 28.

Florian Saurs 31.10.2018 15:25

Разве нельзя просто игнорировать второе событие onFocusChange? Если событие срабатывает и LinearLayout уже свернут / сворачивается, просто ничего не делайте.

Gavin Wright 31.10.2018 16:25

Я не могу, потому что нет ничего, что отличало бы первый вызов от второго, и мне нужно, чтобы эта функция работала в обоих направлениях.

Florian Saurs 31.10.2018 16:28
4
6
639
2

Ответы 2

Я думаю, что происходит следующее:

  1. Пользователь оставляет первый элемент (поэтому фокус уходит с первого элемента, поэтому фокус «меняется», поэтому срабатывает событие onFocuseChange.

  2. Затем мы фокусируемся на выбранном прикомандированном элементе, поэтому снова "focusCahnged", поэтому снова вызывается событие onFocuseChange. так что вы можете сделать:

                    public void onFocusChange(View v, boolean b) {
                               if (v.hasFocus()){
                                     v.performClick()); // or any other logic you need
                               } 
                     }
    

    тогда он сделает то, что вам нужно, только один раз (когда v получит фокус).

удачи :-)

Вы можете добавить isFocusable и FocusableInTouchMode в xml для другого представления

Спасибо! Я использовал ваше решение в stackoverflow.com/a/68953709/2914140.

CoolMind 27.08.2021 14:50

@CoolMind, давай

Mohammad Davari 01.09.2021 08:50

Другие вопросы по теме