如果子视图获得焦点,则 OnKeyListener 或 OnKeydown 不起作用

2023-12-31

我想听 ScrollView 来看看它是否正在滚动。我使用了OnTouchListener,效果很好。但是,当我想使用 OnKeyListener 或重写 OnKeydown 方法为轨迹球添加兼容性时,它无法工作。似乎子按钮获得焦点会导致问题。

有什么解决方案或解决方法可以解决此问题吗?任何帮助表示赞赏。

以下是一些重现我的问题的演示代码:

public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ScrollView scrollView = (ScrollView) findViewById(R.id.scroll_view);
    LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main_layout);

    LinearLayout.LayoutParams wrapParams = new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    for (int i = 0; i < 100; i++) {
        MyItem item = (MyItem) LayoutInflater.from(this).inflate(R.layout.item, null);
        item.setParent(scrollView);
        item.setBackgroundColor(Color.WHITE);
        item.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
        mainLayout.addView(item, wrapParams);
    }

    scrollView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // can go into here
        }

    });

    scrollView.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN || keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
                // never go in, unless no child button get focus
            }
            return false;
        }
    });
}

}

主要.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <com.fannyxie.MyScroller 
        android:id="@+id/scroll_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:descendantFocusability="beforeDescendants"
        android:clickable="true"
        android:focusable="true">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical">
            <LinearLayout android:id="@+id/main_layout"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical">
            </LinearLayout>
        </LinearLayout>
    </com.fannyxie.MyScroller>
</LinearLayout>

项目.xml:

<?xml version="1.0" encoding="utf-8"?>
<com.fannyxie.MyItem xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <TextView 
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="TITLE"/>
    <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:id="@+id/myButton" android:text="Button"></Button>
</com.fannyxie.MyItem>

MyScroller.java

public class MyScroller extends ScrollView {

    public MyScroller(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //not go into here...
        Log.i("MyScroller", "onKeyDown");
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onTrackballEvent(MotionEvent event) {
        //not go into here...
        Log.i("MyScroller", "onTrackballEvent");
        return super.onTrackballEvent(event);
    }

    @Override
    protected boolean onRequestFocusInDescendants(int direction,
            Rect previouslyFocusedRect) {
        //some times go into here, when no button get the focus when entering first time
        Log.i("MyScroller", "request focus in descendants");
        return super.onRequestFocusInDescendants(direction, previouslyFocusedRect);
    }



}

MyItem.java

public class MyItem extends LinearLayout {

    private Button myButton;
    public MyItem(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected boolean onRequestFocusInDescendants(int direction,
            Rect previouslyFocusedRect) {
        // never go into here
        Log.i("MyItem", "request focus in descendants");
        return super.onRequestFocusInDescendants(direction, previouslyFocusedRect);
    }

}

谢谢@杰弗里。但我找到了更好的方法。只需重写 ScrollView 中的dispatchkeyevent 方法并在那里处理轨迹球/键盘事件即可。效果很好。

public class MyScroller extends ScrollView {

public MyScroller(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if ((KeyEvent.KEYCODE_DPAD_UP == event.getKeyCode() || KeyEvent.KEYCODE_DPAD_DOWN == event.getKeyCode())) {
            //handle key events here
    }
    return super.dispatchKeyEvent(event);
}

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果子视图获得焦点,则 OnKeyListener 或 OnKeydown 不起作用 的相关文章

随机推荐

  • 如何以编程方式在 iPhone 上启动 Contacts.app

    我想在用户需要添加联系人时启动 Contacts app 我的应用程序已经从联系人 API 读取 如果可以避免的话 我宁愿不重新实现功能 我的目标是 iOS 4 0 及以上版本 如果您想添加联系人 请使用ABNewPersonViewCon
  • 如何优化全文搜索的 Core Data 查询

    在文本中搜索匹配单词时可以优化核心数据查询吗 这个问题也涉及到 iPhone 上自定义 SQL 与 Core Data 的区别 我正在开发一款新的 iPhone 应用程序 它是科学数据库的手持参考工具 主界面是一个标准的可搜索表格视图 我希
  • 带有 Swift 5.0 编译器的 Xcode 10.2 - 协议继承问题

    当前的 Xcode 版本 10 2 存在一个大问题 有一个BasicViewController具有以下签名的类 class BasicViewController UIViewController UITableViewDataSourc
  • SceneKit:关于像 Tron 光循环一样再现发光光迹的建议

    目标是在 SceneKit 中重现类似于下图的光迹 路径不需要那么详细 但我们的想法是实现类似的视觉效果 我们尝试使用不透明度约为 0 5 的薄立方体 我们将大约 200 个灯串在一起 并将它们连接到一个节点上 作为光迹 那根本没有表现 另
  • 更新文件时从 AWS S3 下载

    这似乎是一个非常基本的问题 但如果我从 S3 下载文件 同时另一个进程正在更新该文件 我是否需要担心获得不完整的文件 示例 200MB 的 CSV 文件 用户 A 开始以 1Mbps 的速度更新文件 其中包含 200MB 的新内容 16秒后
  • 在 Oracle 中将表与其自身连接

    对这个很困惑 我正在尝试将一个表连接到其自身 我有以下详细信息 PRODUCT NO FORMAT NO FORMAT CODE NUMBER 1000 1111 P 0 1000 1112 O 0 1000 1113 H 546 我想创建
  • scikit-learn GaussianHMM ValueError:输入必须是方阵

    我正在使用 scikit learn 的 GaussianHMM 当我尝试将其拟合到一些观察结果时 出现以下 ValueError 这是演示错误的代码 gt gt gt from sklearn hmm import GaussianHMM
  • 使用 Python 通过 HTTP 下载压缩内容

    使用 Python 下载网页时如何利用 HTTP 1 1 的压缩功能 我目前正在使用内置的urllib http docs python org library urllib html用于下载网页内容的模块 通读文档 我找不到任何确实使用压
  • iOS 在故事板中切换嵌入视图

    我一整天都在试图解决这个问题 我知道它应该能够完成 但是作为使用 Objective C 而不是 Appcelerator 的 iOS 开发新手 我遇到了新手问题 我想要完成的是在我的其他视图之一中拥有嵌入视图 但能够通过编程切换嵌入的视图
  • Selenium C# Webdriver 如何检测元素是否可见

    最新版本的 Selenium DotNet Webdriver 2 22 0 有没有办法在单击 交互之前检查元素是否可见 我发现的唯一方法是尝试处理当您尝试发送密钥或单击它时发生的 ElementNotVisible 异常 不幸的是 这仅在
  • 使用 Office365 JS API 从 EWS 或 REST API 访问自定义属性集

    我有一个 Office 365 邮件应用程序 它在保存项目之前将值存储在自定义属性中 保存项目后 我想使用服务器端应用程序访问此属性 阅读自定义属性文档 https msdn microsoft com en us library offi
  • 将数据从视图传递到控制器 asp.net core razor 页面

    我正在尝试创建一个简单的 asp net core razor 网站 我有一个cshtml页面 page using RazorPages model IndexModel using Html BeginForm
  • AngularJS ng-table 固定标头

    我正在使用 ng table 来显示一些信息 我想固定 ng table 的页眉和页脚 并强制 ng table 在行内绘制滚动条 ng table 文档网站没有关于如何实现这一点的文档 有任何想法吗 这个仅 CSS 的解决方案对我有用 只
  • 按员工部门划分且员工人数超过 5 人

    我想显示department id与 count 一起 并且 count 应大于 5 并且我希望有 1 月份未雇用的员工 我尝试了以下查询 SELECT FROM EMPLOYEES WHERE DEPARTMENT ID IN SELEC
  • Excel VBA:等待 Internet Explorer 中的 JavaScript 执行

    我正在尝试在 Excel VBA 中进行一些网页抓取 这是我遇到问题的代码部分 IE Navigate URL Do DoEvents Loop While IE ReadyState lt gt 4 Or IE Busy True Set
  • 修改SVG路径的不透明度及其标记

    我正在尝试对使用 D3 以编程方式定义的路径进行一些修改 我想要进行的更改非常简单 修改路径的不透明度 我遇到的问题是 虽然路径本身会改变 但结束标记不会改变 而且我不太确定如何让它这样做 标记定义如下 define arrow marke
  • 加快 LINQ 插入速度

    我有一个 CSV 文件 我必须将其插入 SQL Server 数据库 有没有办法加快 LINQ 插入速度 我创建了一个简单的存储库方法来保存记录 public void SaveOffer Offer offer Offer dbOffer
  • 无法 pip install mysqlclient 并执行“gcc”:权限被拒绝

    如果我问一些非常简单的事情 请原谅我 我正在远程服务器上通过 Namecheap 设置 Django 应用程序 无 root 访问权限 和我的服务器信息 阿帕奇版本 2 4 38 MySQL 版本 10 1 38 MariaDB cll l
  • 设置 SWT Combo 的颜色

    I m trying to turn color of my readonly combo to white as a non readonly combo 我的只读组合代码 Combo myCombo new Combo sessionP
  • 如果子视图获得焦点,则 OnKeyListener 或 OnKeydown 不起作用

    我想听 ScrollView 来看看它是否正在滚动 我使用了OnTouchListener 效果很好 但是 当我想使用 OnKeyListener 或重写 OnKeydown 方法为轨迹球添加兼容性时 它无法工作 似乎子按钮获得焦点会导致问