继续总结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
- 继续总结fragment的问题
- 继续总结CWinThread实现多线程的问题
- Fragment使用问题总结
- 学习继续的一些总结
- 问题:Activity里面添加多个ViewPager(Fragment),ViewPager里面继续添加Fragment,无法显示
- Fragment的总结
- fragment的使用总结
- Fragment的使用总结
- Fragment的总结
- Fragment的知识点总结
- Fragment的使用总结
- 继续总结
- Fragment的布局问题
- fragment的问题
- fragment嵌套的问题
- Fragment的跳转问题
- Fragment 生命周期的问题
- Fragment的相关问题
- 更新glibc 2.3到glibc2.5的始末
- js获取当前时间(精确到秒)
- 深入理解Aho-Corasick自动机算法
- POJ3107 Godfather 求树的重心
- 华为OJ题目(一):找出字符串中第一个出现一次的字符
- 继续总结fragment的问题
- zlib库剖析(3):使用示例zpipe.c
- 使用VS调试Unity脚本
- android studio 中查看数据库
- php之文件上传
- JSP禁用缓存的方式 response.setHeader( "Pragma", "no-cache" ); setDateHeader("Expires", 0);的用法和什么意思
- 请使用/main进行编译,以指定包含入口点类型
- 自定义JSP标签
- python新手