当我在主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了。