Wear OS表盘应用:如何为偏好设置页面请求焦点以启用旋转输入?
Wear OS 偏好设置页面启用旋转表圈输入的焦点处理方案
要让基于PreferenceFragment的PreferenceScreen支持手表旋钮/旋转表圈输入,核心是确保页面内承载偏好项的RecyclerView获得焦点。具体实现步骤如下:
- 在
PreferenceFragment的onViewCreated方法中,找到内部的RecyclerView(系统默认ID为android.R.id.list)。 - 配置该
RecyclerView可获取焦点,并在视图布局完成后请求焦点。
Kotlin 实现代码
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val preferenceRecyclerView = view.findViewById<RecyclerView>(android.R.id.list) preferenceRecyclerView?.apply { isFocusable = true isFocusableInTouchMode = true // 延迟到视图布局完成后请求焦点,避免无效调用 post { requestFocus() } } }
Java 实现代码
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); RecyclerView preferenceRecyclerView = view.findViewById(android.R.id.list); if (preferenceRecyclerView != null) { preferenceRecyclerView.setFocusable(true); preferenceRecyclerView.setFocusableInTouchMode(true); preferenceRecyclerView.post(() -> preferenceRecyclerView.requestFocus()); } }
关键说明
- Wear OS的旋转表圈输入仅对当前获取焦点的可滚动视图生效,而
PreferenceFragment的RecyclerView默认不会自动请求焦点,导致旋转操作无响应。 - 使用
post方法请求焦点是为了确保视图已经完成布局初始化,避免因视图未就绪导致焦点请求失败。 - 如果存在自定义Preference组件,需确保这些组件不会抢占
RecyclerView的焦点,否则旋转输入仍可能失效。
内容的提问来源于stack exchange,提问作者go3d
相关产品推荐
相关产品推荐

