【发布时间】:2019-08-12 18:20:20
【问题描述】:
我正在使用 Leanback 开发 Android TV 应用,该应用在 Android 4.4.2 上运行
我将 2 个 HorizontalGridView 放在具有垂直方向的 LinearLayout 中。
当第一个 HorizontalGridView 有焦点时,我在 DPAD 中按下 DOWN,焦点成功更改为第二个 HorizontalGridView。
但是,当我在第二个 HorizontalGridView 中的 DPAD 中按 UP 时,焦点不会改变。我希望焦点更改为第一个 HorizontalGridView。
我不知道为什么会这样。有人可以帮忙吗?
我发现有focusOutFront、focusOutEnd、focusOutSideStart、focusOutSideEnd属性,我都设置为true,但没有运气。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/browse_dummy"
android:orientation="vertical"
android:weightSum="20"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_title"
android:layout_weight="5"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="20dp"
android:textSize="24sp"
android:text="ATTRIBUTE NAME"
android:textColor="@drawable/white"/>
<android.support.v17.leanback.widget.HorizontalGridView
android:id="@+id/boxset_vgv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10"
android:focusable="true"
android:focusableInTouchMode="true"
app:focusOutEnd="true"
app:focusOutFront="true"
>
</android.support.v17.leanback.widget.HorizontalGridView>
<!-- Attribute List-->
<android.support.v17.leanback.widget.HorizontalGridView
android:id="@+id/attribute_grid_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5"
android:focusable="true"
android:focusableInTouchMode="true"
app:focusOutEnd="true"
app:focusOutFront="true">
</android.support.v17.leanback.widget.HorizontalGridView>
</LinearLayout>
这里是 HorizontalGridView 的 Presenter
public class AttributePresenter extends Presenter {
private static final String TAG = "AttributePresenter";
private int mBrowserDockId;
public interface AttributeOnSelectedListener {
public void onAttributeSelected(Category attribute, int attributeItemViewId);
}
public AttributeOnSelectedListener mListener;
public AttributePresenter() {
}
public AttributePresenter(AttributeOnSelectedListener listener, int browserDockId) {
mListener = listener;
mBrowserDockId = browserDockId;
}
public AttributePresenter(AttributeOnSelectedListener listener) {
mListener = listener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
int attributeItemViewId = View.generateViewId();
AttributeItemView v = new AttributeItemView(viewGroup.getContext()) {
@Override
public void setSelected(boolean selected) {
if(mListener != null && selected) {
mListener.onAttributeSelected(mAttribute, attributeItemViewId);
}
Log.d("AttributePresenter", "XJIXX");
super.setSelected(selected);
}
};
v.setId(attributeItemViewId);
Log.d(TAG, String.valueOf(mBrowserDockId));
Log.d(TAG, String.valueOf(v.getNextFocusDownId()));
Log.d(TAG, String.valueOf(v.getNextFocusUpId()));
return new Presenter.ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Object item) {
if(item instanceof Category) {
Category attribute = (Category)item;
TextView tv = (TextView)viewHolder.view.findViewById(R.id.tv_attribute_title);
tv.setText(attribute.getName());
((AttributeItemView)viewHolder.view).mAttribute = attribute;
}
}
@Override
public void onUnbindViewHolder(ViewHolder viewHolder) {
}
}
这是项目视图
public class AttributeItemView extends FrameLayout {
public Category mAttribute;
public AttributeItemView(Context context) {
super(context);
LayoutInflater.from(getContext()).inflate(R.layout.attribute_item, this);
setFocusable(true);
setFocusableInTouchMode(true);
}
}
这里是项目布局 xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/attribute_item_layout"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_attribute_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@color/attribute_item_text_selector"
android:text=""/>
</RelativeLayout>
我希望 UP 和 DOWN 可以相应地改变焦点。
【问题讨论】:
标签: android gridview focus leanback