我有一个 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/