获得广播组中单选按钮的焦点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获得广播组中单选按钮的焦点相关的知识,希望对你有一定的参考价值。

在我的代码中,我使用带有单选按钮的无线电组。我希望能够在d-pad /手机的帮助下检查单选按钮。我无法获得单个单选按钮的焦点。我试着做以下事情:

radioButton.setFocusable(真); radioButton.setFocusableInTouchMode(真);

我的广播组以线性布局包装。所以我也试过了linearLayout.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);但到目前为止,对我来说没有任何作用。任何输入都会有所帮助

答案

在为androidTV编写应用程序时,我也遇到了这个问题。即使在视图上设置了nextFocus {direction},水平无线电组焦点似乎也无法用于dpad。

幸运的是,如果您使用leanback库,则可以使用BrowseFrameLayout.onFocusSearchListener通过执行以下操作来自行管理焦点:

首先,确保您的布局和单选按钮组没有focusable或focusableInTouchMode设置为true。这将导致布局/组接收焦点而不是单个按钮。

将您的广播组包裹在BrowseFrameLayout而不是线性布局中:

<android.support.v17.leanback.widget.BrowseFrameLayout
        android:id="@+id/browse_frame_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <RadioGroup
        android:id="@+id/radio_group"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/first_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="First Button Text" />

        <RadioButton
            android:id="@+id/second_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Second Button Text" />

    </RadioGroup>
</android.support.v17.leanback.widget.BrowseFrameLayout>

然后在您的片段或活动代码中添加以下内容:

BrowseFrameLayout.OnFocusSearchListener onFocusSearchListener =
            new BrowseFrameLayout.OnFocusSearchListener() {

                @Override
                public View onFocusSearch(View focused, int direction) {
                    if (focused.getId() == R.id.first_button && direction == View.FOCUS_RIGHT) {
                        return findViewById(R.id.second_button);
                    } else if (focused.getId() == R.id.second_button && direction == View.FOCUS_LEFT) {
                        return findViewById(R.id.first_button);
                    } else if (focused.getId() == R.id.first_button && direction == View.FOCUS_LEFT) {
                        // return null to allow for default focus transition
                        return null;
                    } else {
                        // return focused to avoid focus change
                        return focused;
                    }
                }
            };
    ((BrowseFrameLayout) findViewById(R.id.browse_frame_layout)).setOnFocusSearchListener(onFocusSearchListener);

而已!正如示例代码段中的注释所述,返回null将允许系统处理默认焦点转换,并且返回focus将阻止焦点更改(例如,有助于水平无线电组的上/下点击)。返回任何其他视图将关注该视图。

可以针对任何方向的任何数量/类型的视图调整此代码,因此虽然实现起来很烦人,但它非常有用。

经过很多挫折后,这对我有所帮助,所以我希望它对你有所帮助!

以上是关于获得广播组中单选按钮的焦点的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 win32 c++ 应用程序中单选按钮的状态?

验证单选按钮被选中

iOS 中单选按钮的实现

设置变量值,从无线电组中选择一个单选按钮

如何删除表格视图单元格中单选按钮的索引路径?

如何更改 Metro 应用程序的 XAML/C# 中单选按钮的样式?