我有一个ViewPager的对话框子视图,我有一个setOnKeyListener()和setOnClickListener()设置。但是,即使子视图在应用程序上处于可见焦点(它是 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。但是,我真的不应该这样做。该事件应沿视图层次结构向下传递。这是普遍接受的处理方式吗?不得不这样明确地称呼孩子感觉不对。
显然这是预期的行为。为了让子级接收事件,ViewPager 需要代码来显式处理它。部分原因似乎是由于即使向PageViewer提供了大量视图,通常也只有一部分被主动缓存并且可以调用方法。如果我想让所有孩子都对点击做出反应,我需要做这样的事情:
for(int i=0; i<mViewPager.getChildCount(); i++){
mViewPager.getChildAt(i).performClick();
}
如果您的子视图设置了 OnClickListener,则它将对单击做出反应,但前提是该视图当前位于活动的 ViewPager 缓存中。如果您的视图具有某种可以根据操作更改的状态(例如单击时出现新的可绘制对象,并在再次单击时消失),那么使我发现的所有视图子项受到影响的唯一方法似乎是您需要一个控制器来跟踪状态并设置一个 OnPageChangeListener,该侦听器循环访问"活动"子视图并确保它们都处于正确的状态州。