android - 如何手动聚焦特定 View ?

标签 android android-layout android-widget

我正在尝试为仅使用方向键即可遍历的启动器应用程序创建一个界面。我的布局是分层的,每个顶级项目都有一个选项列表。要导航到第二个列表,用户可以按该项目,或按向右键。

问题是,由于 Android 根据位置确定要聚焦的正确 View 的方式,光标会跳转到不正确的项目(直接位于光标旁边的项目)。参见下图1;如果用户按向右键,开发工具将突出显示,而不是 API 演示。

返回左侧也是如此。在图 2 中,当用户按右键时,将选择“音乐”而不是“应用程序”。

example of layout

到目前为止,我已尝试以下方法来手动选择正确的 View :

appListView.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus) {
            ((ListView) v).getChildAt(0).requestFocus();
        } else {
            findViewById(R.id.apps_button).requestFocus();
        }
    }
});

这会失败(我假设),因为 dpad 操作已经触发了 requestFocus,并且我已经验证了我正在获取正确的 subview , subview 可聚焦,并且 requestFocus() 返回 false;

我该怎么做才能使这项工作按预期进行?预先感谢:)

编辑1:
我还尝试将应用程序按钮 NextFocusRightId 设置为 ListView 的第一项(由列表适配器@位置 0 以编程方式设置);什么都没有。

编辑2: NextFocus___Id 也在处理这些按钮,因为视频的向上焦点是设置,效果很好......

最佳答案

我终于明白了!

手动聚焦列表项最好通过 ListView 本身来完成。通过使用以下更改扩展 ListView 类,它可以干净地向右移动:

@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
    if(gainFocus) {
        setSelection(0);
    } else {
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
    }
}

通过设置 ListView (而不是项目)的 NextFocusLeft 到左侧:

appListView.setNextFocusLeftId(R.id.apps_button);

关于android - 如何手动聚焦特定 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9917012/

相关文章:

java - Android AsyncLoader.onPostExecute 不执行

android - Android Studio:无法同步Gradle项目

android - 获取安卓键盘高度

android - bottone1 无法解析或不是字段

android - 如何动态扩展 ListView 高度 android?

android - 无法为图像或图片、 list 文件配置 BroadCast Receiver

Android 使 MapView 加载速度更快

Android:如何在 Glide 或 Picasso 的占位符中使用 TextView

android - 在输入过程中显示字符数

Android - 像 MySQL 一样的 SQLite 查询