Не удается перейти к кнопке за пределами scrollview с помощью навигации по клавиатуре

#android

#Android

Вопрос:

У меня есть макет, в котором есть верхний, нижний колонтитулы и scrollview между ними

Это мой макет

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@ id/header"
        android:text="@string/player_settings" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@ id/footer"
        android:layout_below="@id/header">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/text_margin"
            android:orientation="vertical">

        .....

            <Button
                android:id="@ id/start"
                android:layout_marginStart="@dimen/text_margin"
                android:layout_marginTop="@dimen/text_margin"
                android:paddingStart="@dimen/button_padding"
                android:paddingEnd="@dimen/button_padding"
                android:text="Start" />

            <Button
                android:id="@ id/close"
                android:layout_marginStart="@dimen/text_margin"
                android:layout_marginTop="@dimen/text_margin"
                android:layout_marginBottom="32dp"
                android:paddingStart="@dimen/button_padding"
                android:paddingEnd="@dimen/button_padding"
                android:text="Close"
                android:nextFocusDown="@ id/save"/>

        </LinearLayout>

    </ScrollView>

    <LinearLayout
        android:id="@ id/footer"
        android:layout_alignParentBottom="true">

        <Button
            android:id="@ id/save"
            android:layout_marginStart="16dp"
            android:text="Save" />

    </LinearLayout>

</RelativeLayout>
  

Приложение будет использоваться с клавиатурой, поэтому я использую кнопки со стрелками для навигации, и когда я нажимаю нижнюю часть scrollview на close кнопку, она должна перейти к кнопке сохранения, но она просто остается на кнопке закрытия. Как вы можете видеть, я даже установил nextFocusDown в качестве кнопки сохранения, но она все еще не включается.

Есть идеи, почему он застревает на кнопке и никогда не переходит к кнопке сохранения за пределами scrollview?

Комментарии:

1. Вы пытаетесь использовать реальное устройство? Я попробовал ваш XML, и он работает на моем эмуляторе

2. да, фактическое устройство, но, возможно, это устройство тогда

3. Вы уже пробовали ответ Ронни??

Ответ №1:

Я пробовал с эмулятором и стрелкой вниз на клавиатуре ноутбука. Мои настройки эмулятора настроены на использование физической клавиатуры. это работает.

Ответ №2:

Вам нужно добавить фокус к кнопкам со свойством Android: android:focusableInTouchMode="true" и в соответствии со стрелками, нажатыми для навигации с помощью клавиатуры, вам нужно добавить следующие свойства с идентификатором, к которому вы хотите перейти:

⬅ android: nextFocusLeft=»@ id / nameid»

⬆ android: nextFocusUp =»@ id / nameid»

➡ android: nextFocusRight=»@ id / nameid»

⬇ android: nextFocusDown=»@ id / nameid»

введите описание изображения здесь

Это ваш макет с моими исправлениями:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@ id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="@string/player_settings"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@ id/footer"
        android:layout_below="@id/header">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/text_margin"
            android:orientation="vertical"
            android:layout_gravity="center">


            <EditText
                android:id="@ id/edit_txt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:imeOptions="actionNext"
                android:singleLine="true"/>


            <Button
                android:id="@ id/start"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusableInTouchMode="true"
                android:layout_marginStart="@dimen/text_margin"
                android:layout_marginTop="@dimen/text_margin"
                android:paddingStart="@dimen/button_padding"
                android:paddingEnd="@dimen/button_padding"
                android:text="Start"
                android:nextFocusRight="@ id/close"/>

            <Button
                android:id="@ id/close"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusableInTouchMode="true"
                android:layout_marginStart="@dimen/text_margin"
                android:layout_marginTop="@dimen/text_margin"
                android:layout_marginBottom="32dp"
                android:paddingStart="@dimen/button_padding"
                android:paddingEnd="@dimen/button_padding"
                android:text="Close"
                android:nextFocusRight="@ id/save"
                android:nextFocusLeft="@ id/start"/>
    </LinearLayout>


    </ScrollView>

    <LinearLayout
        android:id="@ id/footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">

        <Button
            android:id="@ id/save"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:focusableInTouchMode="true"
            android:nextFocusLeft="@ id/close"
            android:text="Save" />

    </LinearLayout>

</RelativeLayout>