【问题标题】:Why focus is not changed when there's 2 HorizontalGridView为什么有2个Horizo​​ntalGridView时焦点没有改变
【发布时间】:2019-08-12 18:20:20
【问题描述】:

我正在使用 Leanback 开发 Android TV 应用,该应用在 Android 4.4.2 上运行

我将 2 个 Horizo​​ntalGridView 放在具有垂直方向的 LinearLayout 中。

当第一个 Horizo​​ntalGridView 有焦点时,我在 DPAD 中按下 DOWN,焦点成功更改为第二个 Horizo​​ntalGridView。

但是,当我在第二个 Horizo​​ntalGridView 中的 DPAD 中按 UP 时,焦点不会改变。我希望焦点更改为第一个 Horizo​​ntalGridView。

我不知道为什么会这样。有人可以帮忙吗?

我发现有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>

这里是 Horizo​​ntalGridView 的 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


    【解决方案1】:

    尝试从 Horizo​​ntalGridView 小部件中删除以下属性:

    android:focusable="true"
    android:focusableInTouchMode="true"
    app:focusOutEnd="true"
    app:focusOutFront="true"
    

    如果焦点仍未正确更改,请发布您的演示者。

    【讨论】:

    • 感谢您的回复。我尝试了你的建议,但没有运气。我刚刚添加了我的 Presenter 和视图源代码。
    • 您只添加了一位演示者。请同时添加另一个。无论如何,尝试将以下语句添加到 onCreateViewHolder 实现中: v.setFocusable(true); v.setFocusableInTouchMode(true);
    猜你喜欢
    • 2016-07-18
    • 2020-05-22
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2019-02-05
    • 2019-08-21
    • 2020-06-12
    相关资源
    最近更新 更多