继续总结fragment的问题

当我在主activity中放了一个viewpager的时候里面放了5个fragment,当我去验证上一篇笔记写的内容的时候突然发现了问题,就是因为viewpager自带缓存页面,当我在一个fragment去想隔壁的fragmrn传递数据的时候可以成功,但是当我隔一个传递的时候竟然报空指针,

public class TwoFragment extends Fragment {
    private TextView txt;
    private String data;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getArguments();
        if(bundle!=null && bundle.getString("data")!=null){
            data = bundle.getString("data");
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_two, null);
        txt = (TextView) view.findViewById(R.id.txt_two);
        return view;
    }

    public void updateTxt(String str){
        Log.i("bbb", str);
        if(!TextUtils.isEmpty(str)){
            txt.setText(str);
        }
    }

}
这是我要接受数据的fragment,

 private ViewPager vp;
    private TabPageIndicator indicator;
    private ArrayList<String> data1 = new ArrayList<String>();
    private TwoFragment two;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        data1.add("你的");
        data1.add("我的");
        data1.add("他的");
        data1.add("别人的");
        vp = (ViewPager) findViewById(R.id.viewpager);
        indicator = (TabPageIndicator) findViewById(R.id.indicator);

        ArrayList<Fragment> data = new ArrayList<Fragment>();
        //向fragment中传递数据
        MainFragemtn aaa = new MainFragemtn();
        Bundle args = new Bundle();
        args.putCharSequence("data", data1.get(3));
        aaa.setArguments(args);

        data.add(aaa);

        MainFragemtn bbb = new MainFragemtn();
        Bundle args1 = new Bundle();
        args1.putCharSequence("data", data1.get(2));
        bbb.setArguments(args1);
        data.add(bbb);

        two = new TwoFragment();
        data.add(two);
        data.add(new MainFragemtn());
        data.add(new MainFragemtn());
        ViewPagerAdapter adapterv = new ViewPagerAdapter(getSupportFragmentManager(),data);
        vp.setAdapter(adapterv);
        indicator.setViewPager(vp);

        SlidingMenu menu = new SlidingMenu(this);
        menu.setMode(SlidingMenu.LEFT);
        // 设置触摸屏幕的模式
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        //menu.setShadowWidthRes(R.dimen.shadow_width);

        // 设置滑动菜单视图的宽度
        menu.setBehindOffsetRes(R.dimen.diemn);
        // 设置渐入渐出效果的值
        menu.setFadeDegree(0.35f);
        /**
         * SLIDING_WINDOW will include the Title/ActionBar in the content
         * section of the SlidingMenu, while SLIDING_CONTENT does not.
         */
        menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
        //为侧滑菜单设置布局
        menu.setMenu(R.layout.menu);
    }


    @Override
    public void click(String str) {
        Log.i("abc", str);
        if(two.isAdded()){
            two.updateTxt(str);
        }

    }
}
这是主activity,当我在回调中拿到当前焦点的数据时,调用第二个fragment的公共更新方法进行数据更新,此时如果fragment没有实例化的时候更新ui会报指针,然后我加上一句isadd()方法就可以判断fragment是否已经在内存中,如果在就更新,不在就不操作,就不会有任何问题。因为viewpager还没有走到第二个fragment的时候并没有用fragmenttransaction  commit实例。所以还没到内存中。


此时我对程序进行了优化,因为不能因为不在就不更新了,岂不是看不到最新数据,


@Override
public void click(String str) {
    Log.i("abc", str);
    if(two.isAdded()){
        two.updateTxt(str);
    }else{
        Bundle args1 = new Bundle();
        args1.putCharSequence("aaa", str);
        two.setArguments(args1);
    }

}
在主activity中如果two、没在内存中那么我就可以通过传参的形式向two里面进行参数传递,只需要在two里面实例化的时候进行接受就可以,且看如下代码:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_two, null);
    txt = (TextView) view.findViewById(R.id.txt_two);

    Bundle bundle = getArguments();
    if(bundle!=null && bundle.getString("aaa")!=null){
        data = bundle.getString("aaa");
    }
    txt.setText(data);

    return view;
}
这个更新必须写在oncreatview()中,否则会爆空指针,提示textview没有初始化。


ok了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值