Я создаю приложение для 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>
По телевизору это выглядит так:
Теперь я замечаю следующее поведение:
Если у меня достаточно элементов меню, чтобы они помещались на экране, нажатие клавиши на пульте дистанционного управления правильно меняет фокус с одного элемента меню на следующий. Однако, если я добавлю слишком много элементов, так что макет переполнится, фокус перескакивает по два за раз.
Я подтвердил, что это не из-за KeyDown, за которым следует событие KeyUp. Сам первоначальный KeyDown вызывает скачок дважды.
Я также пробовал использовать NestedScrollView вместо ScrollView и получил тот же результат.
Ниже я прилагаю гифки правильного и неправильного поведения:
Правильное поведение:
Неправильное поведение:
создать новый 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;
}
}