关于Fragment的一些使用心得-跳转和返回栈实战浅析
来源:互联网 发布:三文鱼部位图解知乎 编辑:程序博客网 时间:2024/06/07 15:05
先说fragment之间的跳转吧!
我的项目中首先是一个activity,在该活动中添加了一个fragmentA,然后需要从fragmentA跳转到fragmentB,那么我的实现方法如下:
// 设置标题右侧文字及单击事件监听 activity.setTitleRight("添加", new View.OnClickListener() { @Override public void onClick(View v) { AddPlanFragment fragment = new AddPlanFragment();// 创建AddPlanFragment对象 showFragment(PlanListFragment.this, fragment);// 跳转添加计划界面 } });/** * 碎片之间的跳转 * @param fragment_current 当前fragment * @param fragment_next 跳转后显示的fragment */ private void showFragment(Fragment fragment_current, Fragment fragment_next) { // 获取FragmentTransaction对象 FragmentTransaction transaction = ((WorkPlanActivity) context) .getSupportFragmentManager().beginTransaction(); if(fragment_next.isAdded()){ // 如果fragment_next已经添加过了,那么直接隐藏fragment_current,显示fragment_next transaction .hide(fragment_current) .show(fragment_next) .addToBackStack(null)// 加入返回栈,点击回退键会返回上一个fragment .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)// 设置转换动画 .commitAllowingStateLoss();// 提交事务 }else { // 如果fragment_next还没有添加,那么用add方法添加该碎片 transaction .hide(fragment_current)// 隐藏fragment_current .add(R.id.frameLayout_workPlan, fragment_next) .addToBackStack(null) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .commitAllowingStateLoss(); } }
上面的代码简单来说就是fragmentA中顶部右侧的标题添加单击事件监听,用以跳转到fragmentB。方法中我加了关键的注释,大家应该能理解。
- 虽说这是一个实现方法,但是难免嵌套多层fragment的时候会出现重影问题(有小概率会出现),我这里有几个比较好的链接给大家去参考参考,然后建议不要嵌套多层:
9行代码让你App内的Fragment对重叠说再见
Fragment全解析系列(二):正确的使用姿势
下面就来说说返回栈吧!
项目中我的activity都继承了一个基类:BaseActivity。
然后顶部的标题布局里的一些textview内容显示以及图标的单击事件监听都在基类中有实现,所以继承该基类可以调用对应的方法即可实现标题中内容的设置以及单击事件的实现。
那么我的一个问题就是在一个activity里面有多个fragment,那么我点击顶部左侧的返回图标时应该是退出当前fragment呢还是说直接销毁当前activity?
如图:
我的解决方案:
要解决这个问题,你需要跳转碎片的时候记得加入返回栈中 addToBackStack(null)
,那么返回栈中会记录你添加了多少个fragment,根据返回栈中的fragment数量来判断究竟是回退到上一个fragment还是说退出activity。我的BaseActivity中的左侧按钮事件代码如下:
/** * 设置左测按钮事件 * * @param id 图片ID * @param onClick 自定义单击事件 */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void setTitleLeft(@NonNull int id, View.OnClickListener onClick) { TextView tv = (TextView) findViewById(R.id.title_tv_left); Drawable left = getResources().getDrawable(id); left.setBounds(0, 0, left.getMinimumWidth(), left.getMinimumHeight()); tv.setCompoundDrawables(left, null, null, null); if (onClick != null) { tv.setOnClickListener(onClick); } else { tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {// finish(); // 如果返回栈中的fragment数量不为0那么点击返回当前fragment将会回退 if(manager.getBackStackEntryCount() != 0){ manager.popBackStack(); }else { // 如果返回栈中的fragmnet数量为0,那么直接退出当前activity finish(); } } }); } }
其中onClick里的代码就是解决方法:判断返回栈中fragment的数量是否为0,为0就直接退出当前activity,不为0就回退到上一个fragment。
其中manager是FragmentManager对象, manager = getSupportFragmentManager();
即可获取该对象。
类似解决方案:
Fragment返回栈与Activity任务栈的结合使用
==================================
每天进步一点点!加油!
- 关于Fragment的一些使用心得-跳转和返回栈实战浅析
- 关于Fragment跳转到Activity 获取返回结果的处理
- Fragment 之间的跳转、返回
- fragment跳转fragment使用onActivityResult返回数据,但无法设置到fragment的textView中
- 关于Fragment使用的一些见解
- 关于Fragment使用的一些见解
- 关于Activity和Fragment的一些问题
- 一些关于Liferay的使用心得
- 一些关于Liferay的使用心得
- 一些关于Liferay的使用心得
- 关于biweb cms 的一些使用心得
- 关于正则表达式使用的一些心得
- 关于TraceView的一些使用心得
- 关于虚拟机vmware使用的一些心得
- 关于number_format()的一些使用心得
- 关于Framework的一些使用心得
- 关于WdatePicker控件的一些使用心得
- 关于Recycleview使用的一些心得
- 76. Minimum Window Substring 10-line template that can solve most 'substring' problems
- <java EE 项目:petstore> 从一个简单项目看 java web 如何在本jsp页面上对用户输入的格式进行限制与验证
- CANopen 块传输通信详解
- JAVA WEB -事务处理
- java泛型之桥方法
- 关于Fragment的一些使用心得-跳转和返回栈实战浅析
- iOS 表格数据刷新
- 生活在智慧龙岗的居民究竟有多幸福?
- SpringMVC+Spring+Mybatis整合配置
- SSD 之OP预留空间
- elasticsearch windows下安装
- iOS 探讨之 动态行为 UIDynamicItem
- JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class
- C++小知识点