在Viewpager中的Fragment使用ContextMenu问题

ContextMenu用法

上下文菜单ContextMenu由系统支持,常用于通过长按控件弹出列表形菜单,实现步骤如下

  • onCreateContextMenu方法 创建菜单
  • registerForContextMenu方法,为需响应的控件注册
  • onContextItemSelected方法,响应点击

在Viewpager中的Fragment使用ContextMenu发生的问题

在我的具体项目环境中,Viewpager中存在3个Fragment(0/1/2),并继承自一个父类BaseFragment。在父类中完成了上下文菜单的绝大部分工作,即上文提到的创建/注册/响应点击;子类中仅重写onCreateContextMenu方法,用于区分修改菜单显示;那么问题来了:

  • 当点击Fragment0的上下文菜单的某项时,Fragment1和2的点击响应事件也同时执行了;
  • 当分别点击Fragment1和2的上下文菜单时,也仍然按照Fragment0-1-2的顺序将响应事件依次执行一遍;

解决方法

问题的症结在于Viewpager改变了其中的Fragment显式的生命周期和关联关系,在前文《关于Activity中的Viewpager中的Fragment的生命周期》我也提到过这一问题,并尝试采用setUserVisibleHint方法解决了问题;在本文中同样,可以采用getUserVisibleHint()方法判断当前Fragment是否真实可见,如可见则响应,不可见则截止并向下分发,直到有可见页面响应为止。

  • 在3个Fragment子类中,均需重写

     public boolean onContextItemSelected(MenuItem item) {
         if (getUserVisibleHint()) {
             return super.onContextItemSelected(item);
         }
         return false;
     }
  • return true 代表截断
  • return false 代表继续分发

另一种解决方案

  • StackOverFlow提供了另一个解决方案,为每一个Fragment分别创建菜单,在创建时设置Group组号,并在分别响应点击时判断组号来完成截止和分发;
  • 本文方法针对我的具体代码而言改动较小,更为简便清晰,故未采用上述方式。
时间: 2024-12-14 10:10:41

在Viewpager中的Fragment使用ContextMenu问题的相关文章

防止ViewPager中的Fragment被销毁

pager.setOffscreenPageLimit(2); 就可以让ViewPager多缓存一个页面 防止ViewPager中的Fragment被销毁,布布扣,bubuko.com

友盟页面统计 - 关于Viewpager中的Fragment的生命周期

Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的.在此不表: Fragment从出现到广泛运用也有一段时间了.其标准生命周期也仅比Activity多出一些流程,如onCreateView(); Activity和Fragment在实际编码中必然是结合出现的,表现为Activity作为容器,装载有一个或若干个Fragment: 装载多个Fragment时,常常使用TabHost和Viewpager作为载体: 在实际编码中发现,Activity和

求解viewpager中的fragment切换,怎么返回数据到activity

============问题描述============ 例如: activity含有一个viewpager和一个textview viewpager有3个fragment可以左右滑动, 滑动到第一个fragment,activity中的textview显示1 滑动到第二个fragment,activity中的textview显示2 滑动到第三个fragment,activity中的textview显示3 这应该怎么处理? ============解决方案1============ ViewPa

防止ViewPager中的Fragment被销毁的方法,更加流畅

在使用ViewPager与Fragment的时候,ViewPager会自动缓存1页内的数据,如下图: 当我们当前处在页面2的时候,页面1和页面3的View实际上已经创建好了,所以在我们拖动的时候是可以看见他们的界面的. 但是当我们的页面处在1的时候,页面3实际上就已经销毁了.直到跳转到页面2的时候,页面3才会创建View. 这时,如果页面3中有需要耗时的事件,比如网络访问.那么,在我们进行 1-->2 的操作的时候,就会不断的出现页面3加载的对话框(如果有的话).而且如果快速的 1-->2--

在ViewPager中切换Fragment 不重新创建 - Android

在使用Viewpager滑动Fragment时,ViewPager只会保存当前页两边的Fragment状态.这样就会出现这样的情况: 一打开会初始化page1和page2,当手动切换到page3时page4就会初始化,但是page1就会销毁,当再切换到page1时page1就会重新初始化. 其实这是Viewpager提供的一种性能优化,叫做懒加载. 但是这种情况会导致切换时page中的布局老是重新创建,状态保存不了,体验不流畅,解决办法就是设置Viewpage的缓存页数; android.sup

(转)防止ViewPager中的Fragment被销毁的方法

在使用ViewPager与Fragment的时候,ViewPager会自动缓存1页内的数据,如下图: 当我们当前处在页面2的时候,页面1和页面3的View实际上已经创建好了,所以在我们拖动的时候是可以看见他们的界面的. 但是当我们的页面处在1的时候,页面3实际上就已经销毁了.直到跳转到页面2的时候,页面3才会创建View. 这时,如果页面3中有需要耗时的事件,比如网络访问.那么,在我们进行 1-->2 的操作的时候,就会不断的出现页面3加载的对话框(如果有的话).而且如果快速的 1-->2--

向 ViewPager 中添加 包含 ListView 的 Fragment

对与fragment就不说什么了,直接看API手册吧,亲. 向 ViewPager 中添加 包含 ListView 的 Fragment 的过程比较麻烦.他所表现的效果就是新闻客户端的滑动翻页效果. 在这里就不粘代码了.只把思路理一下.代码有时间再粘: 一,你需要一个 ViewPager :在实验时,我的activity中就只有一个ViewPager.没有别的东西. 二,你需要一个自定义的fragment,在我们这里的话,这种fragment中有一个listView就可以了(布局文件中只有一个L

viewpager中彻底性动态添加、删除Fragment

为了解决彻底删除fragment,我们要做的是:1.将FragmentPagerAdapter 替换成FragmentStatePagerAdapter,因为前者只要加载过,fragment中的视图就一直在内存中,在这个过程中无论你怎么刷新,清除都是无用的,直至程序退出: 后者 可以满足我们的需求.2.我们可以重写Adapter的方法--getItemPosition(),让其返回PagerAdapter.POSITION_NONE即可: @Override public int getItem

解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题。

这两天开始在改OSChina的开源android客户端,打算用Fragment来分离Main这个Activity里的功能.用Fragment嵌套ViewPager+Fragment的时候发现问题. 红色框的是主Fragment,蓝色框是主Fragment内嵌的ViewPager+Fragment. 例如当"资讯"切换到"问答"的时候,"问答"内的ViewPager+Fragment显示不符合预期,因为里面的Fragment错位了,前面几个显示的是