继续总结fragment的问题

来源:互联网 发布:icp备案后怎么使用域名 编辑:程序博客网 时间:2024/05/29 11:15

当我在主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实例。所以还没到内存中。


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


@Overridepublic 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@Overridepublic 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
原创粉丝点击