总的来说,这个TAB用起来还算方便吧
不过随着用的地方多起来,发现了一些问题,比如下面这个界面:
TAB1和TAB2都是表单,保存按钮对两个TAB都有效:若当前显示TAB1,点击保存则保存TAB1的form;若当前显示TAB2,点击保存则TAB2的form。现在的情况是,在每个TAB的fragment中都拿到这个保存的button,然后对其设置click事件,如此操作可能有这样的一个结果:打开这个界面,什么也不操作,直接点击保存,这个时候保存的是TAB2的form,而当前显示的却是TAB1。
这个问题困扰了很久,尝试了很多方法:
1、给TAB标签的onclick事件中加入调用fragment的onResume(),手动去调fragment的onResume方法,在fragment的onResume()中设置button的onclick事件。点击TAB即可改变button的监听器,但是对于直接进页面就点击保存按钮仍然无效;
2、给viewpage的滑动事件中添加调用fragment的onResume(),这个方法和方法1效果类似;
3、想:一般情况很少有人打开界面之后直接点击保存,都会做一些界面操作,比如,输入文本之类,所以想到给TAB1的fragment中设置一个OnTouchListener,这个只要用户对TAB1界面操作,在OnTouchListener中捕捉到,然后对button设置click,这样就OK了。即使用户进入界面,什么不操作直接点击保存,也不会出现保存错误的问题。
虽然想要的效果实现了,但是心里感觉还是很不爽,总感觉有个疙瘩。今天无意中看到一篇博文:“Fragment真正意义上的onResume和onPause:Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效果”,拿过来一试,果然很爽。
在TAB的fragment中重写它的setUserVisibleHint(),如下:
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser){ activity.findViewById(R.id.bt_title_Right).setOnClickListener(this); } }
很好的结果了这个问题,在此感谢:农民伯伯。
参考:http://www.cnblogs.com/over140/p/3392164.html