Android 开发中使用Fragment跳转到下一个Fragment(使用add方法),并实现返回键和自定义返回键。
来源:互联网 发布:淘宝裸根月季苗 编辑:程序博客网 时间:2024/05/22 09:51
Android 开发中使用Fragment跳转到下一个Fragment,并实现返回键和自定义返回键。
项目结构:
主类:
MainActivity
FirstFragment
SecondFragment
辅助文件:
BackHandledInterface.java
BackHandledFragment .java
实现逻辑 入口:MainActivity中包含MainFragment并且能跳转到SecondFragment
返回:SecondFragment ---> MainFragment--->结束当前activity;
初衷:
看到 Android 使用Fragment界面向下跳转并一级级返回 一文中,作者使用 replace()方法实现fragment的跳转,本人项目中需要使用add(), hiden()方法所以寻求改变思路。
解决方案如下:
BackHandledInterface.java保持不变
public interface BackHandledInterface { public abstract void setSelectedFragment(BackHandledFragment selectedFragment);}
BackHandledFragment.java, 如下
public abstract class BackHandledFragment extends Fragment { protected BackHandledInterface mBackHandledInterface; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!(getActivity() instanceof BackHandledInterface)) { throw new ClassCastException( "Hosting Activity must implement BackHandledInterface"); } else { this.mBackHandledInterface = (BackHandledInterface) getActivity(); } } @Override public void onStart() { super.onStart(); // 告诉FragmentActivity,当前Fragment在栈顶 mBackHandledInterface.setSelectedFragment(this); } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden);//如果hidden为true则隐藏,否则显示 if (!hidden) { mBackHandledInterface.setSelectedFragment(this); } }}
我重写了onHidden方法因为当每次在fragment在调用show() 和hidden()方法都会调用此方法。show() 和hidden()并不会调用onStart(),所以不重新则无法告诉FragmentActivity,当前Fragment在栈顶.
主界面MainActivity,我集成了AppCompatActivity,兼容类。
</pre><pre name="code" class="java">public class MainActivity extends AppCompatActivity implements BackHandledInterface { private static MainActivity mInstance; private BackHandledFragment mBackHandedFragment; private Button btnSecond; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); android.support.v4.app.Fragment fragment = new FirstFragment(); getSupportFragmentManager().beginTransaction().add(R.id.bus_content, fragment, <pre name="code" class="java">"tag").commit(); bt_back= (ImageView) findViewById(R.id.back); bt_back.setVisibility(View.VISIBLE); bt_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mBackHandedFragment.getClass().getSimpleName().toString().equals("FirstFragment.getClass().getSimpleName().toString()")){ finish();//如果当前为FirstFragment怎退出activity }else { getSupportFragmentManager().popBackStack();//否则把顶部的状态弹出回退堆栈 } } }); } @Override public void setSelectedFragment(BackHandledFragment selectedFragment) { this.mBackHandedFragment = selectedFragment; }}
FirstFragment.java
public class FirstFragment extends BackHandledFragment implements View.OnClickListener { //四个button private ImageView bt_RouteQuery; public BusMainFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_bus_main, container, false); bt_RouteQuery = (ImageView) rootView.findViewById(R.id.imgbtn_routequery); bt_RouteQuery.setOnClickListener(this); return rootView; } @Override public void onClick(View v) { String tag; switch (v.getId()) { case R.id.imgbtn_routequery: tag = FragmentFactory.BusRouteFragment; getActivity().getSupportFragmentManager().beginTransaction() .hide(this) .add(R.id.bus_content, new SecondFragment(), <pre name="code" class="java">"tag")) .addToBackStack(null)//增加到回退栈,官方的说法是取决于你是否要在回退的时候显示上一个Fragment,此句话我实现了物理返回键返回到上个fragment .commit(); break; default: break; } }}
SecondFragment.java无任何需求,则不贴出来。
总结:
通过重写onHidden方法实现了,完善了自定义按钮的返回功能。以及由于add和replace的原理不一致导致的bug。
更加简单的addToBackStack(null)实现了物理返回键的返回功能。(这一点我再回去研究研究,是否存在bug,为什么前人文章不这么使用).
申明:本人刚刚从学校毕业,如有什么地方写的不对的请告诉我,让我也能进步学习。感谢
0 0
- Android 开发中使用Fragment跳转到下一个Fragment(使用add方法),并实现返回键和自定义返回键。
- Android 使用Fragment界面向下跳转并一级级返回
- fragment跳转fragment使用onActivityResult返回数据,但无法设置到fragment的textView中
- Android开发-Fragment返回键监听-AndroidStudio
- Fragment中管理返回键的方法
- Fragment跳转到activity,然后返回到fragment并且刷新该页面(activity跳转Fragment)
- Android Fragment中监听返回键
- Android开发监听返回键返回上个网页或者fragment
- Android单击通知栏后返回正在运行的程序并跳转到指定fragment页面
- android Fragment 通信 返回键
- android fragment 监听返回键
- android Fragment 返回键 退出
- Android fragment监听返回键
- Fragment中监听返回键
- Fragment中监听返回键
- Android transaction Fragment时按返回键直接退出,没有返回到上一个Fragment
- Fragment 跳转activity 并返回结果
- Android-Fragment的使用,切换和返回等问题
- 《启示录》阅读笔记(7)——产品评审团
- Android 第三方开源SwipeMenuListView(QQ侧滑置顶,删除)
- 【APP GAME KIT】能碰到障碍物的移动小人
- 浅谈粒子群算法的学习方法-Particle Swarm Optimisation
- 根据一点坐标和距离计算另一点坐标(PHP),以及计算两点间距离(PHP)
- Android 开发中使用Fragment跳转到下一个Fragment(使用add方法),并实现返回键和自定义返回键。
- 【codechef】Save Spaceman Spiff(人能否安全从起点走到终点)
- 限制root用户登录ssh
- Android 第三方开源PullToRefresh加入Item(系列2)
- Android工程引用其他项目
- ios 9.1以后 添加libz.dylib 方法
- 组合算法
- Leetcode 第171题 Excel Sheet Column Number
- 【笔记】设计模式(PHP) - [01]