Элементы в ScrollView или NestedScrollView перемещают фокус по два за раз

Я создаю приложение для Android TV. У меня такой макет:

<ScrollView xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical"
android:transitionGroup = "false">

    <LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:id = "@+id/abc"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical"
    android:transitionGroup = "false">

        <TextView
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:fontFamily = "sans-serif-condensed"
        android:text = "Menu Title"
        android:focusable = "false"
        android:focusableInTouchMode = "false"/>

        <Button
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Menu 1"
        android:fontFamily = "sans-serif-condensed"
        android:textStyle = "normal"
        android:textAlignment = "textStart"/>

        <Button
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Menu 2"
        android:fontFamily = "sans-serif-condensed"
        android:textStyle = "normal"
        android:textAlignment = "textStart"/>

        .
        .
        .

        <Button
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Menu 9"
        android:fontFamily = "sans-serif-condensed"
        android:textStyle = "normal"
        android:textAlignment = "textStart"/>

     </LinearLayout>

</ScrollView>

По телевизору это выглядит так:

Элементы в ScrollView или NestedScrollView перемещают фокус по два за раз

Теперь я замечаю следующее поведение:

Если у меня достаточно элементов меню, чтобы они помещались на экране, нажатие клавиши на пульте дистанционного управления правильно меняет фокус с одного элемента меню на следующий. Однако, если я добавлю слишком много элементов, так что макет переполнится, фокус перескакивает по два за раз.

Я подтвердил, что это не из-за KeyDown, за которым следует событие KeyUp. Сам первоначальный KeyDown вызывает скачок дважды.

Я также пробовал использовать NestedScrollView вместо ScrollView и получил тот же результат.

Ниже я прилагаю гифки правильного и неправильного поведения:

Правильное поведение:

Элементы в ScrollView или NestedScrollView перемещают фокус по два за раз

Неправильное поведение:

Элементы в ScrollView или NestedScrollView перемещают фокус по два за раз

0
0
355
1

Ответы 1

создать новый NewScrollView и расширить метки ScrollView и Override executeKeyEvent ();

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

import android.content.Context;
import android.util.AttributeSet;
import android.view.FocusFinder;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ScrollView;

/**
 * created by: wuzf
 * date: 2019/05/08
 * email: [email protected]
 */
public class NewScrollView extends ScrollView {
public NewScrollView(Context context) {
    super(context);
}

public NewScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public NewScrollView(Context context, AttributeSet attrs, int defStyleAttr) 
{
    super(context, attrs, defStyleAttr);
}

public NewScrollView(Context context, AttributeSet attrs, int 
  defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
public boolean executeKeyEvent(KeyEvent event) {
//        return super.executeKeyEvent(event);
    if (isFocused() && event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
        View currentFocused = findFocus();
        if (currentFocused == this) currentFocused = null;
        View nextFocused = FocusFinder.getInstance().findNextFocus(this,
                currentFocused, View.FOCUS_DOWN);
        return nextFocused != null
                && nextFocused != this
                && nextFocused.requestFocus(View.FOCUS_DOWN);
    }
    return false;
}
}

Другие вопросы по теме