Установка порядка фокуса для обернутых компонентов на Android - PullRequest
0 голосов
/ 04 октября 2019

У меня проблемы с управлением порядком фокусировки при использовании пользовательских компонентов. В частности, когда я обертываю EditText с нефокусируемыми компонентами, а затем помещаю два в горизонтальный LinearLayout, только первый получит фокус. (Я добавляю другие функции сверху; приведенный ниже код является MRE.)

Я пытался использовать nextFocusForward и nextFocusDown, чтобы установить порядок фокусировки, что, как я подтвердил, работает правильно на необработанных EditTexts, ноэто не на пользовательском представлении. Я также попытался передать атрибут в EditText, но это тоже не сработало. Я также попытался сделать фокусировку моего пользовательского представления, но он не получает события фокуса (я думаю, потому что вместо них принимает EditText) и имеет ту же проблему.

edittext_wrapper.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/label"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        tools:text="test"
        />
</LinearLayout>

EditTextWrapper.java:

public class EditTextWrapper extends LinearLayout {
    public EditTextWrapper(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.edittext_wrapper, this, true);
    }
}

activity_test.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
    <com.....EditTextWrapper
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
    >
        <com.....EditTextWrapper
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:nextFocusDown="@id/right"
            />
        <com.....EditTextWrapper
            android:id="@+id/right"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />
    </LinearLayout>
    <com.....EditTextWrapper
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Я ожидаю, когда курсор находится во втором EditText, и вы нажимаете следующую клавишу наклавиатура, которая идет к третьему, но вместо этого идет к четвертому.

Я подозреваю, что причина ручной установки идентификатора для nextFocusDown не сработала, потому что я использую идентификатор своего класса-оболочкикоторый не фокусируется. Я не совсем уверен, что мне следует делать дальше.

1 Ответ

0 голосов
/ 11 октября 2019

Я проверил, что изменить ваш файл edittextwrapper.xml

<?xml version="1.0" encoding="utf-8"?>

<EditText
    android:id="@+id/label"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/app_name"
    android:imeOptions="actionNext"
    android:inputType="textEmailAddress"
    tools:text="test" />

А также вы можете использовать это для виджетов фокусировки

view.requestFocus();
...