Най-добрият начин за дефокусиране на текст за редактиране, когато потребителят взаимодейства с друг (нетекстуален) входен елемент

Имам дейност с някои текстове за редактиране и някои квадратчета за отметка и т.н.

Имам валидатори, зададени на текстови записи, които се изпълняват, когато текстов запис загуби фокус. Но проблемът е, когато потребителят щракне/докосне квадратче за отметка, edittext не губи фокус и следователно валидаторът не се изпълнява.

Кой е най-добрият начин за предизвикване на разфокусиране на текстови записи, когато потребителят докосне друго поле за въвеждане? Знам, че мога напр. задайте манипулатор на всяко квадратче за отметка, за да се случи принудително разфокусиране на текстови полета, но мисля, че вероятно има по-кратък/общ метод за тази цел; Задаването на манипулатор на всяко поле за отметка изглежда твърде тромаво и податливо на грешки.

Благодаря.


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)


Можете да опитате по този начин (това е само пример).

вашата_активност.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