Лучший способ расфокусировать текст редактирования, когда пользователь взаимодействует с другим (нетекстовым) элементом ввода

У меня есть активность с некоторыми текстами редактирования и некоторыми флажками и т.д.

У меня есть валидаторы, установленные для текстовых записей, которые выполняются, когда текстовая запись теряет фокус. Но проблема в том, что когда пользователь щелкает/касается флажка, текст редактирования не теряет фокус, и поэтому валидатор не запускается.

Каков наилучший способ вызвать расфокусировку текстовых записей, когда пользователь касается другого поля ввода? Я знаю, что могу, например. установите обработчик для каждого флажка, чтобы принудительно расфокусировать текстовые поля, но я думаю, что для этой цели, вероятно, есть более краткий/общий метод; Установка обработчика для каждого флажка кажется слишком громоздкой и подверженной ошибкам.

Спасибо.


person user273084    schedule 06.10.2017    source источник
comment
Я обновил свой ответ.   -  person John Le    schedule 06.10.2017
comment
Вы можете проверить этот вопрос.   -  person Mehmed    schedule 06.10.2017
comment
Ура! это работает: stackoverflow.com/a/43828004/2982512   -  person user273084    schedule 06.10.2017


Ответы (1)


Вы можете попробовать этот способ (это только пример).

your_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sv_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true"
        android:orientation="vertical">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="EditText 1" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="EditText 2" />

        ..............other views................

    </LinearLayout>

</ScrollView>

Использование android:focusableInTouchMode="true" в LinearLayout для того, чтобы EditText сфокусировалось при прикосновении к нему (или при запуске этого действия нет автоматического фокуса ни на одном EditText).

В вашей деятельности:

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.test);

        ScrollView svContent = findViewById(R.id.sv_content);
        svContent.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                int action  = motionEvent.getAction();

                if(action == MotionEvent.ACTION_MOVE || action == MotionEvent.ACTION_UP) {
                    View focusView = getCurrentFocus();
                    if (focusView != null) {
                        // The code for unfocus here

                        return true;
                    }
                }
                return false;
            }
        });
    }
person John Le    schedule 06.10.2017
comment
Я проверил ваш код. К сожалению, OnTouchListener не вызывается, когда я нажимаю на флажок напрямую; но он вызывается, когда я нажимаю на пустое место в моем макете. - person user273084; 06.10.2017