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

时间:2017-04-07 00:15:48

标签: android android-layout listview android-radiogroup android-radiobutton

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

首先,确保您的布局和广播组没有可聚焦或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将阻止焦点更改(例如,有助于水平无线电组的上/下点击)。返回任何其他视图将关注该视图。

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

这让我感到非常沮丧,所以我希望它可以帮到你!