java - 如何获得具有焦点的 ViewPager 以将dispatchKeyEvent() 传递给其 subview ?

标签 java android user-interface android-viewpager

我有一个 ViewPager 的对话框 subview ,我有 setOnKeyListener() 和 setOnClickListener() 设置。但是,即使 subview 处于应用程序上的可见焦点(它是 ViewPager 上的对话框),监听器也不会在按键时被调用。进一步的调查似乎表明,如果 ViewPager 具有焦点,则它不会传递dispatchKeyEvent()。但是,如果我使用以下代码在 ViewPager 上设置 OnKeyListener:

mViewPager.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP
            && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) {

            final int childIndex = mViewPager.getCurrentItem();
            mViewPager.getChildAt(childIndex).performClick();
        }
        return false;
    }
});

对子项的显式单击调用将激活 OnClickListener。然而,我真的不应该这样做。事件应该沿着 View 层次结构向下传递。这是处理这个问题的普遍接受的方法吗?必须像这样明确地称呼 child 感觉不对。

最佳答案

显然这是有意的行为。为了让子级接收事件,ViewPager 需要代码来显式处理它。部分原因似乎是由于即使向 PageViewer 提供了大量 View 列表,通常也只有一个子集被主动缓存并且可以调用其方法。如果我希望所有 child 都能对点击使用react,我需要执行以下操作:

for(int i=0; i<mViewPager.getChildCount(); i++){
    mViewPager.getChildAt(i).performClick();
}

如果您的 subview 设置了 OnClickListener,那么它会对点击使用react,但前提是该 View 当前位于 Activity 的 ViewPager 缓存中。如果您的 View 具有某种可以根据操作进行更改的状态(例如新的可绘制对象在单击时出现,并在再次单击时消失),那么我发现,使所有 View 子级受到影响的唯一方法似乎是您需要一个 Controller 来跟踪状态并设置一个 OnPageChangeListener 来迭代“Activity ”子级 View 并确保它们都处于正确的状态。

关于java - 如何获得具有焦点的 ViewPager 以将dispatchKeyEvent() 传递给其 subview ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926792/

相关文章:

java - 在运行时更改 JList 行颜色

java - 按下按钮时在同一 Canvas 上绘制多个形状

java - 如何使用 Google Guice 绑定(bind)不同的接口(interface)?

java - libGDX - 如何在特定位置停止玩家的移动?

java - 如何在 Java Swing 中构建 Google-chrome 选项卡和菜单栏界面?

android - Gallery 内的 ScrollView 内的按钮不响应点击

java - libGDX 中的 keyDown() 方法如何正常工作?

Android Web Kit 和如何使用 Web Kit?

android - 从我的 Android 应用程序使用 GCM 推送通知

java - 如何在 Android 中使用 Intent 向服务发送信息