如果子视图获得焦点,则 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 不起作用 的相关文章

  • 如何使用 ProGuard 将所有方法保留在类中

    我使用 ProGuard 来优化我的 Android 应用程序 然而 对于 Android 仪器测试 我需要一些 但不是全部 类来保留所有成员 我尝试了各种方法 最后一个是 keepclassmembers public class com
  • Android 上有哪些字体可用? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道安卓有一个字体集合 http www ascenderfonts com store search
  • 使用库来维护免费/付费的应用程序版本

    维护免费 付费应用程序版本的共识似乎是使用库 并从每个活动中设置一个标志 以从代码库中获取不同的功能 这有多安全 据我了解 一个人可以root他们的手机 获取APK 并且可以对其进行反编译 即使代码被混淆 也不难看出该应用程序是带有标志的包
  • 在 Anko DSL 中创建自定义 View/ViewGroup 类

    我想创建一个自定义视图 它只是一些 Android 视图的包装 我考虑创建一个自定义 ViewGroup 来管理其子视图的布局 但我不需要这么复杂 我基本上想做的是 class MainActivity verticalLayout tex
  • 如何获取.so文件的依赖项列表?

    假设我有libFoo so为 android arm 编译 我不确定它链接到什么STL实现 有options http developer android com intl ru ndk guides standalone toolchai
  • 毕加索动画加载图像

    我有以下代码在毕加索中加载图像 使用可绘制的占位符在图像下载时显示 不过 我想要的是一个动画旋转进度条样式的旋转器 它可以在图像加载时不断地旋转 就像我在大多数专业应用程序中看到的那样 毕加索似乎不支持这一点 只支持静态图像可绘制 有没有办
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 应用内结算错误

    我的 UNMANAGED 应用内购买无法正常工作 在它完美运行之前 我可以使用测试帐户成功购买 但它突然不起作用了 因为我记得我对商家帐户所做的只是添加更多 2 4 个测试帐户 添加后 我的应用内购买将不起作用 所以我更新了公钥并上传了一个
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • finish() 完成活动但它仍然在后台

    我有一个关于 android studio 中活动的 finish 方法的问题 我有这个简单的代码 public class MainActivity extends AppCompatActivity Override protected
  • Firebase ANR - 甚至不使用 firebase

    随着 GMS 的最新更新 引入了新的 ANR 如果您退出应用程序 然后返回 则 ANR 就会初始化 线程跟踪似乎指向 Firebase 但我什至从未开始使用 Firebase 我猜它一定是新的 GMS 包的一部分 06 11 00 34 0
  • 导航抽屉默认片段

    我是一名新手开发人员 我正在将导航抽屉与 android support v7 集成到我的应用程序中 我有一个问题 当我启动应用程序时 主要布局是这样的
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • 如何以编程方式启动 ssh 服务器 android,以及如何获取连接到设备的用户名和密码

    我正在开发像这样的应用程序sshdroid 我想在 Android 操作系统上打开 ssh 连接 并且我想从电脑连接应用程序 我使用了 JSCH lib 但是这个lib用于将android连接到pc 我的要求是pc到android 任何人都
  • JavaDoc 在 Android 项目中不起作用

    我在 Ubuntu 10 04 上使用 Eclipse 3 5 2 进行 Android 开发 我安装了 来自 Ubuntu 存储库的 Sun JDK Eclipse 3 5 2 经典 来自 eclipse org 解压到 opt ecli
  • onClick 未在带有子项的 LinearLayout 上触发

    我有一个自定义的 LinearLayout 和一个较小的 TextView 子级 我希望能够单击 TextView 未覆盖的区域 因此我将 clickable true 和 onclicklistener 设置为 LinearLayout
  • onBackPressed 隐藏 不破坏 Activity

    我知道如何取消后退按键 以便活动 主窗口保持可见 public void onBackPressed return 我的目标是隐藏该活动 但是 在没有完成它的情况下 您如何在 onBackPressed 事件中做到这一点 即我想达到 onP
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz

随机推荐

  • 如何以编程方式在 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 方法为轨迹球添加兼容性时 它无法工作 似乎子按钮获得焦点会导致问