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