ViewPager+Fragment组合时,常常会用到在Fragment里获得当前Fragment被选中的状态,然后在每当Fragment选中时下做一些动画,数据初始化的操作。网上很多解决方式是使用Fragment里面的
setUserVisibleHint(boolean isVisibleToUser)
{
if(isVisibleToUser)
{
//当页面被选中
}
}
可实践证明这个回调方法会在Fragement的creatView()方法之前调用这就意味着,如果在setUserVisibleHint(boolean isVisibleToUser)做一些更新UI的操作是行不通的(特别是第一次Frament初始化的时候)。
现在我采用另外以一种方式解决这个问题。我们知道,ViewPager上可以设置OnPageChangeListener(如下)里面有三个回调方法,其中一个就是
ViewPager.OnPageChangeListener pageChangeListener =
new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position,
float positionOffset,
int positionOffsetPixels) {
//viewpager的偏移量,从哪个偏移到哪个
}
@Override
public void onPageSelected(int position) {
//viewPage中被选中的位置(里面的第几个被选中)
}
看到这里你有什么思路了没,对!没错,我们可以使用回调函数,把viewper中页面被选中的信息通知回调给Fragment。
先说下我理解的回调,所谓回调就是 回调函数用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调。其根本就是讲触发这一动作叫下层。我们这里的“上层”就是Fragment,“下层”就是他所属的Activity。把被选中这一动作的触发交给Activity,因为Activity中有 public void onPageSelected(int position) {}我们可以在这里面触发回调,告诉Frament你被选中了。
话不多说开干!
MainActivity中定义接口, 编写设置的方法
interface OnFragmentSelectedListener{
public void fragmentSelected( int position);
}
/**
* 选中实例
*/
public List<OnFragmentSelectedListener> fragmentSelectedList;
/**
* 设置选中接口
*/
private void setOnFragmentSelected(List<OnFragmentSelectedListener> fragmentSelectedList){
this.fragmentList =fragmentList;
}
/**
viewpager监听
*/
ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
/**
当回调Fragment选中函数
*/
@Override
public void onPageSelected(int position) {
if(fragmentList!=null){
for(int i =0;i<3;i++){
((FragmentSelected)fragmentList.get(i)).fmSetected(position);
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
};
在Fragmen中做必不可少的操作就是实现定义好的接口,然后在实现的方法中判断,判断当前Frament的选中状态
public class FragmentStatsItem1 extends Fragment implements MainActivity.OnFragmentSelectedListener{
public void fragmentSelected( int position){
/**
当Activity中的Viewpager中的元素发生变化时,就会触发这个函数,并把选中哪一个元素选中的信息传递过来,只要在这个函数里判断是否跟当前Fragment里在Viewpager所处的位置跟position的值是否一直,如果一直表示当前选中,如果不一致表示不选中
*/
}
}
就这样了,转载请注明出处http://blog.youkuaiyun.com/u012455330/article/details/50312175。