Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在leanback的标题视图中使用多个Orb按钮或其他按钮_Android_Android Tv_Leanback - Fatal编程技术网

Android 在leanback的标题视图中使用多个Orb按钮或其他按钮

Android 在leanback的标题视图中使用多个Orb按钮或其他按钮,android,android-tv,leanback,Android,Android Tv,Leanback,是否可以在leanback showcase应用程序的自定义标题视图中使用多个SearchOrb按钮或其他可聚焦按钮?问题是我只能对焦一个按钮 更新: 我所做的: 有一个自定义标题视图类,它包含搜索Orb、标题文本视图、自定义Orb和模拟时钟 问题是,当我尝试聚焦搜索Orb时,焦点会转到自定义Orb。。。就这些。只关注自定义球体 单击“侦听器”以设置主搜索Orb。我不知道问题出在哪里。如果需要,我可以根据需要发布其他代码 谢谢你的帮助 titleview.xml: <?xml versio

是否可以在leanback showcase应用程序的自定义标题视图中使用多个SearchOrb按钮或其他可聚焦按钮?问题是我只能对焦一个按钮

更新:

我所做的:

有一个自定义标题视图类,它包含搜索Orb、标题文本视图、自定义Orb和模拟时钟

问题是,当我尝试聚焦搜索Orb时,焦点会转到自定义Orb。。。就这些。只关注自定义球体

单击“侦听器”以设置主搜索Orb。我不知道问题出在哪里。如果需要,我可以根据需要发布其他代码

谢谢你的帮助

titleview.xml:

<?xml version="1.0" encoding="utf-8"?>
    <com.olegmart.smart.base.CustomTitleView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/browse_title_group"
    android:padding="16dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <android.support.v17.leanback.widget.SearchOrbView
        android:id="@+id/search_orb"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:transitionGroup="true"
        android:layout_gravity="center_vertical|start"
        android:layout_marginTop="8dp"
        android:paddingStart="48dp"
        android:focusable="true"
        android:nextFocusRight="@+id/grid_orb"
        />

    <AnalogClock
            android:id="@+id/clock"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:padding="6dp"
            android:layout_alignParentEnd="true"
            android:layout_gravity="center_vertical|end"
            android:layout_marginEnd="24dp" />

    <android.support.v17.leanback.widget.SearchOrbView
        android:id="@+id/grid_orb"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="24dp"
        android:layout_centerVertical="true"
        android:layout_toStartOf="@id/clock"
        android:nextFocusLeft="@+id/search_orb"
        android:focusable="true"
        />



    <TextView
            android:id="@+id/title_tv"
            android:textAppearance="@android:style/TextAppearance.Large"
            android:visibility="gone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="24dp"
            android:layout_centerVertical="true"
            android:layout_toStartOf="@id/grid_orb" />

</merge>
自定义_titleview.xml:

<?xml version="1.0" encoding="utf-8"?>
    <com.olegmart.smart.base.CustomTitleView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/browse_title_group"
    android:padding="16dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <android.support.v17.leanback.widget.SearchOrbView
        android:id="@+id/search_orb"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:transitionGroup="true"
        android:layout_gravity="center_vertical|start"
        android:layout_marginTop="8dp"
        android:paddingStart="48dp"
        android:focusable="true"
        android:nextFocusRight="@+id/grid_orb"
        />

    <AnalogClock
            android:id="@+id/clock"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:padding="6dp"
            android:layout_alignParentEnd="true"
            android:layout_gravity="center_vertical|end"
            android:layout_marginEnd="24dp" />

    <android.support.v17.leanback.widget.SearchOrbView
        android:id="@+id/grid_orb"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="24dp"
        android:layout_centerVertical="true"
        android:layout_toStartOf="@id/clock"
        android:nextFocusLeft="@+id/search_orb"
        android:focusable="true"
        />



    <TextView
            android:id="@+id/title_tv"
            android:textAppearance="@android:style/TextAppearance.Large"
            android:visibility="gone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="24dp"
            android:layout_centerVertical="true"
            android:layout_toStartOf="@id/grid_orb" />

</merge>

如果希望对屏幕上的可聚焦项进行更多自定义,则可能需要查看中的nextFocusForward和类似XML属性。

如果希望对屏幕上的可聚焦项进行更多自定义,您可能需要查看中的nextFocusForward和类似XML属性。

在BrowseFrameLayout中,OnFocusSearchListener会截取普通的focusSearch:

并且在您的情况下很可能返回null,请参阅:

private final BrowseFrameLayout.OnFocusSearchListener mOnFocusSearchListener =
        new BrowseFrameLayout.OnFocusSearchListener() {
    @Override
    public View onFocusSearch(View focused, int direction) {
        // if headers is running transition,  focus stays
        if (mCanShowHeaders && isInHeadersTransition()) {
            return focused;
        }
        if (DEBUG) Log.v(TAG, "onFocusSearch focused " + focused + " + direction " + direction);

        if (getTitleView() != null && focused != getTitleView() &&
                direction == View.FOCUS_UP) {
            return getTitleView();
        }
        if (getTitleView() != null && getTitleView().hasFocus() &&
                direction == View.FOCUS_DOWN) {
            return mCanShowHeaders && mShowingHeaders ?
                    mHeadersFragment.getVerticalGridView() : mMainFragment.getView();
        }

        boolean isRtl = ViewCompat.getLayoutDirection(focused) == View.LAYOUT_DIRECTION_RTL;
        int towardStart = isRtl ? View.FOCUS_RIGHT : View.FOCUS_LEFT;
        int towardEnd = isRtl ? View.FOCUS_LEFT : View.FOCUS_RIGHT;
        if (mCanShowHeaders && direction == towardStart) {
            if (isVerticalScrolling() || mShowingHeaders || !isHeadersDataReady()) {
                return focused;
            }
            return mHeadersFragment.getVerticalGridView();
        } else if (direction == towardEnd) {
            if (isVerticalScrolling()) {
                return focused;
            } else if (mMainFragment != null && mMainFragment.getView() != null) {
                return mMainFragment.getView();
            }
            return focused;
        } else if (direction == View.FOCUS_DOWN && mShowingHeaders) {
            // disable focus_down moving into PageFragment.
            return focused;
        } else {
            return null;
        }
    }
};
一个非常难看的解决方法是扩展您自己的BrowseFrameLayout或BrowseFrameLayout。在BrowseFrameLayout中,OnFocusSearchListener会截取普通的focusSearch:

并且在您的情况下很可能返回null,请参阅:

private final BrowseFrameLayout.OnFocusSearchListener mOnFocusSearchListener =
        new BrowseFrameLayout.OnFocusSearchListener() {
    @Override
    public View onFocusSearch(View focused, int direction) {
        // if headers is running transition,  focus stays
        if (mCanShowHeaders && isInHeadersTransition()) {
            return focused;
        }
        if (DEBUG) Log.v(TAG, "onFocusSearch focused " + focused + " + direction " + direction);

        if (getTitleView() != null && focused != getTitleView() &&
                direction == View.FOCUS_UP) {
            return getTitleView();
        }
        if (getTitleView() != null && getTitleView().hasFocus() &&
                direction == View.FOCUS_DOWN) {
            return mCanShowHeaders && mShowingHeaders ?
                    mHeadersFragment.getVerticalGridView() : mMainFragment.getView();
        }

        boolean isRtl = ViewCompat.getLayoutDirection(focused) == View.LAYOUT_DIRECTION_RTL;
        int towardStart = isRtl ? View.FOCUS_RIGHT : View.FOCUS_LEFT;
        int towardEnd = isRtl ? View.FOCUS_LEFT : View.FOCUS_RIGHT;
        if (mCanShowHeaders && direction == towardStart) {
            if (isVerticalScrolling() || mShowingHeaders || !isHeadersDataReady()) {
                return focused;
            }
            return mHeadersFragment.getVerticalGridView();
        } else if (direction == towardEnd) {
            if (isVerticalScrolling()) {
                return focused;
            } else if (mMainFragment != null && mMainFragment.getView() != null) {
                return mMainFragment.getView();
            }
            return focused;
        } else if (direction == View.FOCUS_DOWN && mShowingHeaders) {
            // disable focus_down moving into PageFragment.
            return focused;
        } else {
            return null;
        }
    }
};

一个相当难看的解决方法是扩展您自己的BrowseFragment或BrowseFrameLayout

滕宝玉是正确的……BrowseFragment中的OnFocusSearchListener是焦点更改没有如您所预期发生的原因

先来点背景

当焦点搜索发生时,它将首先调用当前视图组中的focusSearch方法。在这种情况下,当搜索orb具有当前焦点,并且用户按下d-pad以在不同方向聚焦时,第一个对焦点搜索的回调将在CustomTitleView类中。只有在CustomTitleView将focusSearch传播到父级之后,才会调用BrowseFragment的OnFocusSearchListener

这里真正的问题是在撰写本文时,Leanback BrowseFragment的OnFocusSearchListener已编码,因此您添加到CustomTitleLayout的其他视图将永远无法获得焦点

但是,有一种方法可以在CustomTitleLayout中集中其他子视图

覆盖CustomTitleLayout中的focusSearch方法,如下面的代码示例所示,并返回存在于自定义标题布局中的可聚焦视图,而不是返回super.focusSearch

注意:此代码取决于在CustomTitleView的子级上设置nextFocusLeft和nextFocusRight属性。此外,子视图必须是可聚焦视图按钮…等。如果子视图在默认情况下不可聚焦(如TextView),则必须通过android:focusable=true的XML或view.setFocusabletrue的代码手动启用视图可聚焦


邓宝玉是正确的……BrowseFragment中的OnFocusSearchListener是焦点更改没有如您所期望的那样发生的原因

先来点背景

当焦点搜索发生时,它将首先调用当前视图组中的focusSearch方法。在这种情况下,当搜索orb具有当前焦点,并且用户按下d-pad以在不同方向聚焦时,第一个对焦点搜索的回调将在CustomTitleView类中。只有在CustomTitleView将focusSearch传播到父级之后,才会调用BrowseFragment的OnFocusSearchListener

这里真正的问题是在撰写本文时,Leanback BrowseFragment的OnFocusSearchListener已编码,因此您添加到CustomTitleLayout的其他视图将永远无法获得焦点

但是,有一种方法可以在CustomTitleLayout中集中其他子视图

覆盖CustomTitleLayout中的focusSearch方法,如下面的代码示例所示,并返回存在于自定义标题布局中的可聚焦视图,而不是返回super.focusSearch

注意:此代码取决于在CustomTitleView的子级上设置nextFocusLeft和nextFocusRight属性。此外,子视图必须是可聚焦视图按钮…等。如果子视图在默认情况下不可聚焦(如TextView),则必须通过android:focusable=true的XML或view.setFocusabletrue的代码手动启用视图可聚焦


到目前为止你做了什么?你能发布你遇到的代码和错误信息吗?添加了代码。谢谢你的帮助!请注意,没有错误代码-所有操作都正常,但除一个按钮外,其他按钮没有聚焦。到目前为止,您做了什么?你能发布你遇到的代码和错误信息吗?添加了代码。谢谢你的帮助
! 请注意,没有错误代码-所有操作正常,但除一个按钮外,其他按钮均未聚焦。nextFocusLeft\nextFocusRight与nextFocusForward的方法非常相似。问题是我无法聚焦主搜索orb。您可以调用。requestFocus是的,我尝试调用requestFocus并将requestFocus标记添加到布局中。无任何更改:nextFocusLeft\nextFocusRight与nextFocusForward的方法非常相似。问题是我无法聚焦主搜索orb。您可以调用。requestFocus是的,我尝试调用requestFocus并将requestFocus标记添加到布局中。没什么变化:干杯,伙计,这个关注点的东西很复杂,但是你的代码帮助我找到了我需要的部分。@ScottOper任何一天我都可以帮助其他开发人员,这是一个好日子!干杯,伙计,这个关注点的东西很复杂,但是你的代码帮助我找到了我需要的部分。@ScottOper任何一天我都可以帮助其他开发人员,这是一个好日子!