所以,点击有点有趣ViewPager
,因为ViewPager
在捕获点击/动作事件时有点贪婪。一种解决方案 https://stackoverflow.com/a/11303508/1003511涉及覆盖ViewPager
's ViewGroup.onInterceptTouchEvent(MotionEvent ev) http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29。然而,这并不总是必要的。具体来说,如果不这样做,我无法为寻呼机设置 onClickListener,而是为视图设置 onClickListenerinside寻呼机非常适合我(我在最后附加了一个代码示例)。但是,我从来没有这样做过GridView
/onItemClickListener.您所做的本质上是为寻呼机内的视图内的视图设置一个点击侦听器,这是另一层。当您在 Android 中嵌套事物时,由于系统处理点击消耗的方式,触摸事件的管理变得更加复杂。
您的情况的问题是,有些东西正在消耗您的触摸事件,而没有将其传递到列表项。本质上,Android处理触摸事件的方式是,当触摸事件发生时,它会将其传递给顶层视图的触摸事件处理函数。如果视图处理了该事件,它将返回 true,并且系统知道该事件已被处理并且已完成。如果视图不想处理该事件,它将返回 false,并且系统将事件传递到层次结构中的下一个最高视图。就你而言,有些东西(可能是ViewPager
或者可能是GridView
) 在事件到达网格项之前就消耗该事件,因此 onItemClickListener 永远不会被触发。
作为测试,如果您可以为GridView
(如整个视图)并使其正常工作,这意味着问题不在于ViewPager
。在这种情况下,您可能需要实现您自己的版本GridView
并重写它处理触摸事件的方式,以确保该事件到达子项。但是,如果这不起作用,您将需要覆盖ViewPager
, 就像之前提到的。
(注意:显然,这两种解决方案都需要大量时间,因此在执行任何一种解决方案之前,请确保仔细检查是否存在任何简单错误,例如将侦听器置于错误的视图上、误读行为并认为它不是当它是时开火,等等)
作为参考,这里是一个可以运行的 instantiateItem 方法的版本(实际上仍在进行中,所以它不是 100% 漂亮)。 “菜单页”视图是LinearLayout
.
public Object instantiateItem(View collection, int position) {
LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int page = R.layout.menu_page;
String meal = "";
switch (position) {
case 0:
meal = "Breakfast!";
break;
case 1:
meal = "Lunch!";
break;
case 2:
meal = "Dinner!";
break;
}
View view = inflater.inflate(page, null);
TextView mealTitle = (TextView) view.findViewById(R.id.meal_title);
mealTitle.setText(meal);
((ViewPager) collection).addView(view, 0);
final ViewPager pager = (ViewPager)collection;
View menupage = view.findViewById(R.id.menu_page_ll);
menupage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int page = ((ViewPager) pager).getCurrentItem();
Intent i = new Intent(getApplicationContext(), Menus.class);
i.putExtra("page", page);
startActivity(i);
}
});
return view;
}