ViewPager+Fragment时,在Fragment中得知自己被选中

当使用ViewPager与Fragment结合时,需要在Fragment内部知道其是否被选中以便执行特定操作。然而,`setUserVisibleHint(boolean isVisibleToUser)`方法可能在Fragment的`onCreateView()`之前调用,不适用于UI更新。为解决此问题,可以通过实现`OnPageChangeListener`并在`onPageSelected(int position)`中使用回调函数将ViewPager的选中状态通知给Fragment。在MainActivity中定义接口,Fragment实现该接口并根据回调判断自身的选中状态。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值