这里我们有两种方法:

方法一:

直接在 Fragment 中获取托管它的 activity 中的 FragmentManager,然后直接提交事务进行替换:

// AFragment.java  (这里是从 AFragment 跳转到 BFragment)
BFragment bFragment = BFragment.newInstance();
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.beginTransaction().replace(R.id.fragment_container, bFragment).commit();

这种方法简单暴力,但不可取。why?因为我们在开发中使用 fragment 的目的就是能够让界面能得到复用,也就是让 fragment 保持独立性,而不需要知道托管它的 activity 到底是哪一个。

上面这段示例可以看到,在 AFragment 中我们将 BFragment 添加给了 FragmentActivity(托管它们的 Activity),而且我们还硬性的知道 FragmentActivity 的布局中包含 ID 为 fragment_container 的组件。而作为 Fragment 并不应该知道这些细节,这样就会导致这个 Fragment 的托管 Activity 只能是 FragmentActivity,所以我们详细看一下第二种方法,并在开发过程中使用这种方式。

方法二:

通过回调接口的方式进行跳转。通过在 Fragment 中定义接口的方式,我们把需要托管 activity 处理的工作任务都交给 activity 本身来处理,也就是托管 activity 负责实现要托管的 Fragment 中的接口,然后 Fragment 直接调用托管 activity 的实现就好了。这样 Fragment 就不需要关心它的托管者是谁了,只要实现它的接口就万事大吉了。

下面我们来实现一下:

a. 在 AFragment 中定义回调接口

// AFragment.java
private CallbackAFragment mCallbackAFragment;public interface CallbackAFragment{void skipToBFragment();
}@Override
public void onAttach(Context context) {super.onAttach(context);mCallbackAFragment = (CallbackAFragment) context;
}@Override
public void onDetach() {super.onDetach();mCallbackAFragment = null;
}

可以看到,我们首先定义了一个成员变量,用于存放实现 Callbacks 接口的对象,而实现这个接口的对象就是托管它的 activity,因为 fragment 添加到 activity 时的生命周期回调方法为 onAttach(),所以我们直接在这个方法中为 mCallbacks 赋值。然后在相应的生命周期销毁方法中将 mCallbacks 设置为 null,以保证该 Fragmeng 与该 activity 不在有关联性。

b. 在 AFragment 中定义回调接口

最后,托管该 Fragment 的 activity 实现上面定义的接口即可。

下面是完整 demo:

// FragmentActivity.java
public class FragmentActivity extends AppCompatActivity implements AFragment.CallbackAFragment, BFragment.CallbackBFragment {private FragmentManager mManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mManager = getSupportFragmentManager();Fragment fragment = mManager.findFragmentById(R.id.fragment_container);if(fragment == null){fragment = AFragment.newInstance();mManager.beginTransaction().add(R.id.fragment_container, fragment).commit();}}@Overridepublic void skipToBFragment() {BFragment bFragment = BFragment.newInstance();mManager.beginTransaction().replace(R.id.fragment_container, bFragment).commit();}@Overridepublic void skipToAFragment() {AFragment aFragment = AFragment.newInstance();mManager.beginTransaction().replace(R.id.fragment_container, aFragment).commit();}
}
// AFragment.java
public class AFragment extends Fragment {private CallbackAFragment mCallbackAFragment;public interface CallbackAFragment{void skipToBFragment();}@Overridepublic void onAttach(Context context) {super.onAttach(context);mCallbackAFragment = (CallbackAFragment) context;}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.a_fragment, container, false);Button button = view.findViewById(R.id.a_fragment_btn);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 方法一: 跳转到 BFragment
//                BFragment bFragment = BFragment.newInstance();
//                FragmentManager fm = getActivity().getSupportFragmentManager();
//                fm.beginTransaction()
//                        .replace(R.id.fragment_container, bFragment)
//                        .commit();mCallbackAFragment.skipToBFragment();}});return view;}public static AFragment newInstance() {return new AFragment();}@Overridepublic void onDetach() {super.onDetach();mCallbackAFragment = null;}
}
// BFragment.java
public class BFragment extends Fragment {private CallbackBFragment mCallbackBFragment;public interface  CallbackBFragment{void skipToAFragment();}@Overridepublic void onAttach(Context context) {super.onAttach(context);mCallbackBFragment = (CallbackBFragment)context;}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.b_fragment, container, false);Button button = view.findViewById(R.id.b_fragment_btn);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 方法一: 跳转到 AFragment
//                AFragment aFragment = AFragment.newInstance();
//                FragmentManager fm = getActivity().getSupportFragmentManager();
//                fm.beginTransaction()
//                        .replace(R.id.fragment_container, aFragment)
//                        .commit();mCallbackBFragment.skipToAFragment();}});return view;}public static BFragment newInstance() {return new BFragment();}@Overridepublic void onDetach() {super.onDetach();mCallbackBFragment = null;}
}
// a_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"><Buttonandroid:id="@+id/a_fragment_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="50sp"android:textColor="@android:color/black"android:text="A Fragment"android:textAllCaps="false"/>
</LinearLayout>
// b_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"><Buttonandroid:id="@+id/b_fragment_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="50sp"android:textColor="@android:color/black"android:text="B Fragment"android:textAllCaps="false"/>
</LinearLayout>
// activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent"/>

同一个 Activity 中 fragment 之间的跳转处理相关推荐

  1. 三个activity之间跳转 数据传递_第二百四十二回:Android中Fragment之间的数据传递概述...

    各位看官们大家好,上一回中咱们说的是Android中Activity之间数据传递的例子,这一回咱们说的例子是Fragment之间的数据传递.闲话休提,言归正转.让我们一起Talk Android吧! ...

  2. 老式Android中碎片Fragment之间的跳转和数据传递

    随着jetpack组件的使用,fragment之间的跳转和传值已经有相应的demo了.但是有时候难免不用Navigation,或者一些老项目的维护.这里,简单记录下老式fragment怎么跳转和传值. ...

  3. 多个Activity与Fragment之间的数据传递

    多个Activity与Fragment之间数据传递 问题描述 解决思路 具体解决 bug de到亲妈落泪. 问题描述 首先展示个人问题的整体框架: ActivityA:主页面,有一个PageView控 ...

  4. Android Activity与Fragment之间的传值概述

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. Activity 与 Fragment 之间进行数据传递是,在Activity中将要传递的数据封装在 Bundle中,然后在 Acti ...

  5. python中同一个类中方法之间的变量怎么调用

    class A:A = "你好"def test_a(self):self.m = "hello" #实例变量def test_b(self):self.tes ...

  6. Android中fragment之间和Activity的传值、切换

    介绍: 功能介绍:通过一个activity下方的三个按钮,分别是发送消息(sendButton).聊天记录(chatButton).常用语(commonButton).当单击按钮是,来切换上方的fra ...

  7. activity中fragment 返回键不退出_分享一波阿里Android客户端面经,我竟连这都答不上来?...

    今天整理了电脑,发现了几个月前总结了一半的阿里面经,想起来了去年秋招不愉快的阿里一面,今天分享给大家.希望大家前事不忘后事之师,吸取经验教训. 一面(挂) 1.点击图标,应用打开,点击home键,重新 ...

  8. 外部Activity和fragment之间的切换,传值

    下,Activity A /*下6h,*//*传值*//*跳转到Activity的Fragment中*/ Intent intent = new Intent(); intent.putExtra(& ...

  9. 如何优雅的在 Activity、Fragment 之间传递参数

    前言 对于 Kotlin 早就有所耳闻,而且 Google 粑粑也大力推行 Kotlin 了,作为一个 Android coder 还是要紧跟粑粑的步伐的.恰巧遇上公司项目大改版,于是就决定将 Jav ...

最新文章

  1. 正则表达式基础(一)
  2. webStorm 注册码
  3. 《C champion》C语言发展
  4. 使用Apache Flume抓取数据(1)
  5. hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...
  6. 网站(前端、后端)性能(架构)优化手段
  7. 小米财报:Q3营收537亿创新高 经调净利35亿超市场预期
  8. 如何在Linux桌面环境下自动启动程序?
  9. linux查文件被哪些程序占用—fuser和lsof的使用
  10. 展示全面快速响应能力 华为全线解决方案亮相北京国际通信展
  11. 韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验
  12. Ajax前台传数组,Java后台接收方式
  13. 代码版本控制用SVN还是Git好?
  14. Alexa世界排名作弊分析
  15. 你有一份七夕赚钱指南等待签收
  16. 中产需要盒马,盒马想要下沉
  17. 小米手机v3.exo 合并_eXo Platform 3.0访谈
  18. Python - 体脂率
  19. CS0533隐藏继承的抽条成员/CS0534不实现继承的抽象成员
  20. Scala初级实践——统计手机耗费流量(1)

热门文章

  1. 2019年9月1日 星期日 今日学习内容
  2. 计算机应用研学心得体会,研学心得体会作文800字
  3. 学术写作中的字体应用规则:斜体、罗马体、粗体与希腊字母的使用
  4. 网剧如何靠广告植入的奶水来喂饱自己?
  5. 腾讯云星星海SA2云服务器性能如何?配置和价格怎样?
  6. python recvfrom函数详解_Python socket.recvfrom方法代码示例
  7. python lcut精确分词_Python jieba库分词模式实例用法
  8. HTML5之drawImage函数
  9. java finalize 作用_Java中finalize()用法
  10. VS无法查找或打开 PDB 文件