• Fragment的四种跳转方式


    本文主要记录了关于fragment的四种跳转方式:  

    1、从同一个Activiy的一个Fragment跳转到另外一个Fragment  
    2、从一个Activity的Fragment跳转到另外一个Activity  
    3、从一个Activity跳转到另外一个Activity的Fragment上
    4、从一个Activity的Fragment跳转到另外一个Activity的Fragment上

    写这篇文章只是一个简单的记录,当初我学这里的时候看别人的文章总是觉得云里雾里的,后来自己也觉得差不多可以了,于是写下这篇博客,也是记录自己的学习过程。

    首先新建一个项目,然后新建两个活动MainActivity、OtherActivity。
    在MainActivity的布局文件中写一个子布局:

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:orientation="vertical"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent">
    5. <FrameLayout
    6. android:id="@+id/fragment_container"
    7. android:layout_width="match_parent"
    8. android:layout_height="0dp"
    9. android:layout_weight="1"/>
    10. LinearLayout>

    新建一个my_fragment.xml布局与MyFragment类

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:orientation="vertical"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent">
    5. <TextView
    6. android:layout_width="match_parent"
    7. android:layout_height="wrap_content"
    8. android:text="MyFragment"
    9. android:textSize="40sp"
    10. android:gravity="center_horizontal"/>
    11. <Button
    12. android:id="@+id/my_button"
    13. android:layout_width="wrap_content"
    14. android:layout_height="wrap_content"
    15. android:textAllCaps="false"
    16. android:text="To YourFragment"/>
    17. <Button
    18. android:id="@+id/my_other"
    19. android:layout_width="wrap_content"
    20. android:layout_height="wrap_content"
    21. android:textAllCaps="false"
    22. android:text="To OtherActivity"/>
    23. LinearLayout>

    MyFragment类就暂时省略了,后面会贴出所有代码。
    在MainActivity中先添加进一个Fragment进行最开始的展示(压栈式添加)

    1. public class MainActivity extends AppCompatActivity {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_main);
    6. getSupportFragmentManager()
    7. .beginTransaction()
    8. .replace(R.id.fragment_container,new MyFragment())
    9. .addToBackStack(null)
    10. .commit();
    11. }
    12. }

    从同一个Activiy的一个Fragment跳转到另外一个Fragment

    这个跳转与上面初始显示Fragment类似。
    新建your_fragment.xml布局与YourFragment类。

    1. public class YourFragment extends Fragment {
    2. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    3. View contentView;
    4. contentView = inflater.inflate(R.layout.your_fragment, container, false);
    5. return contentView;
    6. }
    7. @Override
    8. public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    9. super.onActivityCreated(savedInstanceState);
    10. Button myReturn = (Button) getActivity().findViewById(R.id.my_return);
    11. myReturn.setOnClickListener(new View.OnClickListener() {
    12. //返回到上一个Fragment(同一个Activity中)
    13. @Override
    14. public void onClick(View v) {
    15. getActivity().getSupportFragmentManager().popBackStack();
    16. }
    17. });
    18. }
    19. }

    your_fragment.xml就暂时先省略了,最后会贴出全部代码。

    跳转部分代码如下,通过点击按钮跳转:

    1. myButton.setOnClickListener(new View.OnClickListener() {
    2. @Override
    3. public void onClick(View v) {
    4. /** 一、从同一个Activity的一个Fragment跳到另外一个Fragment*/
    5. //压栈式跳转
    6. getActivity().getSupportFragmentManager()
    7. .beginTransaction()
    8. .replace(R.id.fragment_container, new YourFragment(), null)
    9. .addToBackStack(null)
    10. .commit();
    11. }
    12. });

    从一个Activity的Fragment跳转到另外一个Activity

    此跳转与Activity之间的跳转十分相似,只要引用上下文的时候,改成getActivity()即可。

    跳转关键代码:

    1. myOther.setOnClickListener(new View.OnClickListener() {
    2. /**
    3. 二、从一个Activity的Fragment跳转到另外一个Activity(等同于Activity之间的跳转(上下文是getActivity))
    4. */
    5. @Override
    6. public void onClick(View v) {
    7. Intent intent = new Intent(getActivity(),OtherActivity.class);
    8. startActivity(intent);
    9. }
    10. });

    从一个Activity跳转到另外一个Activity的Fragment上

    我们要从OtherActivity跳转到MainActivity的YourFragment上去:
    首先,我们在OtherActivity中的跳转事件中给MainActivity传递一个参数,命名为id:

    1. Intent intent = new Intent(OtherActivity.this, MainActivity.class);
    2. intent.putExtra("id",1);
    3. startActivity(intent);

     然后,我们在MainActivity里接收id值,对值进行判断,如果正确进行跳转操作:

    1. int id = getIntent().getIntExtra("id", 0);
    2. if (id == 1) {
    3. getSupportFragmentManager()
    4. .beginTransaction()
    5. .replace(R.id.fragment_container,new YourFragment())
    6. .addToBackStack(null)
    7. .commit();
    8. }

    从一个Activity的Fragment跳转到另外一个Activity的Fragment上

    新建other_fragment.xml布局作为OtherActivity的一个Fragment。

     这种跳转与第三种跳转极为类似,我们只需要将上面的

    Intent intent = new Intent(OtherActivity.this, MainActivity.class);

    书写在对应的Fragment中,将OtherActivity.this更改为getActivity(),其他不用改变,就能完成跳转。

    关键代码如下:

    1. public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    2. super.onActivityCreated(savedInstanceState);
    3. Button ToButton = (Button) getActivity().findViewById(R.id.to_button);
    4. ToButton.setOnClickListener(new View.OnClickListener() {
    5. @Override
    6. public void onClick(View v) {
    7. Intent intent = new Intent(getActivity(), MainActivity.class);
    8. intent.putExtra("id",1);
    9. startActivity(intent);
    10. }
    11. });
    12. }

    所有代码文件

    最后附上所有的代码文件。  
    MainActivity:

    1. package com.example.fragment_activity_skiptest;
    2. import android.content.Intent;
    3. import android.support.v7.app.AppCompatActivity;
    4. import android.os.Bundle;
    5. import android.view.View;
    6. public class MainActivity extends AppCompatActivity {
    7. @Override
    8. protected void onCreate(Bundle savedInstanceState) {
    9. super.onCreate(savedInstanceState);
    10. setContentView(R.layout.activity_main);
    11. getSupportFragmentManager()
    12. .beginTransaction()
    13. .replace(R.id.fragment_container,new MyFragment())
    14. .addToBackStack(null)
    15. .commit();
    16. int id = getIntent().getIntExtra("id", 0);
    17. if (id == 1) {
    18. getSupportFragmentManager()
    19. .beginTransaction()
    20. .replace(R.id.fragment_container,new YourFragment())
    21. .addToBackStack(null)
    22. .commit();
    23. }
    24. }
    25. }

    MyFragment:

    1. package com.example.fragment_activity_skiptest;
    2. import android.content.Intent;
    3. import android.os.Bundle;
    4. import android.support.annotation.Nullable;
    5. import android.support.v4.app.Fragment;
    6. import android.view.LayoutInflater;
    7. import android.view.View;
    8. import android.view.ViewGroup;
    9. import android.widget.Button;
    10. public class MyFragment extends Fragment {
    11. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    12. View contentView;
    13. contentView = inflater.inflate(R.layout.my_fragment, container, false);
    14. return contentView;
    15. }
    16. @Override
    17. public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    18. super.onActivityCreated(savedInstanceState);
    19. Button myButton = (Button) getActivity().findViewById(R.id.my_button);
    20. Button myOther = (Button) getActivity().findViewById(R.id.my_other);
    21. myButton.setOnClickListener(new View.OnClickListener() {
    22. @Override
    23. public void onClick(View v) {
    24. /** 一、从同一个Activity的一个Fragment跳到另外一个Fragment*/
    25. //压栈式跳转
    26. getActivity().getSupportFragmentManager()
    27. .beginTransaction()
    28. .replace(R.id.fragment_container, new YourFragment(), null)
    29. .addToBackStack(null)
    30. .commit();
    31. }
    32. });
    33. myOther.setOnClickListener(new View.OnClickListener() {
    34. /**
    35. 二、从一个Activity的Fragment跳转到另外一个Activity(等同于Activity之间的跳转(上下文是getActivity))
    36. */
    37. @Override
    38. public void onClick(View v) {
    39. Intent intent = new Intent(getActivity(),OtherActivity.class);
    40. startActivity(intent);
    41. }
    42. });
    43. }
    44. }

    OtherActivity:

    1. package com.example.fragment_activity_skiptest;
    2. import android.content.Intent;
    3. import android.support.v7.app.AppCompatActivity;
    4. import android.os.Bundle;
    5. import android.view.View;
    6. import android.widget.Button;
    7. public class OtherActivity extends AppCompatActivity {
    8. @Override
    9. protected void onCreate(Bundle savedInstanceState) {
    10. super.onCreate(savedInstanceState);
    11. setContentView(R.layout.activity_other);
    12. Button button = (Button)findViewById(R.id.to_MainActivity_YourFragment);
    13. Button button_back = (Button)findViewById(R.id.back);
    14. Button button_fm = (Button)findViewById(R.id.to_OtherFragment);
    15. button.setOnClickListener(new View.OnClickListener() {
    16. /*从一个Activity跳转到另外一个Activity的Fragment上
    17. 例如我们要从OtherActivity跳转到MainActivity的YourFragment上去:
    18. 首先,我们在OtherActivity中的跳转事件中给MainActivity传递一个名为id的参数:
    19. 然后,我们在MainActivity里接收id值,对值进行判断,如果正确进行跳转操作:
    20. */
    21. @Override
    22. public void onClick(View v) {
    23. Intent intent = new Intent(OtherActivity.this, MainActivity.class);
    24. intent.putExtra("id",1);
    25. startActivity(intent);
    26. }
    27. });
    28. button_back.setOnClickListener(new View.OnClickListener() {
    29. @Override
    30. public void onClick(View v) {
    31. finish();
    32. }
    33. });
    34. button_fm.setOnClickListener(new View.OnClickListener() {
    35. @Override
    36. public void onClick(View v) {
    37. getSupportFragmentManager()
    38. .beginTransaction()
    39. .replace(R.id.frame_container, new OtherFragment(), null)
    40. .addToBackStack(null)
    41. .commit();
    42. }
    43. });
    44. }
    45. }

    OtherFragment:

    1. package com.example.fragment_activity_skiptest;
    2. import android.content.Intent;
    3. import android.os.Bundle;
    4. import android.support.annotation.Nullable;
    5. import android.support.v4.app.Fragment;
    6. import android.view.LayoutInflater;
    7. import android.view.View;
    8. import android.view.ViewGroup;
    9. import android.widget.Button;
    10. public class OtherFragment extends Fragment {
    11. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    12. View contentView;
    13. contentView = inflater.inflate(R.layout.other_fragment, container, false);
    14. return contentView;
    15. }
    16. @Override
    17. public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    18. super.onActivityCreated(savedInstanceState);
    19. Button ToButton = (Button) getActivity().findViewById(R.id.to_button);
    20. ToButton.setOnClickListener(new View.OnClickListener() {
    21. /*4、从一个Activity的Fragment跳转到另外一个Activity的Fragment上
    22. 这种跳转与第三种跳转极为类似,我们只需要将
    23. Intent intent = new Intent(OtherActivity.this, MainActivity.class);
    24. 书写在对应的Fragment中,将OtherActivity.this更改为getActivity(),其他不用改变,几个完成跳转.
    25. */
    26. @Override
    27. public void onClick(View v) {
    28. Intent intent = new Intent(getActivity(), MainActivity.class);
    29. intent.putExtra("id",1);
    30. startActivity(intent);
    31. }
    32. });
    33. }
    34. }

    YourFragment:

    1. package com.example.fragment_activity_skiptest;
    2. import android.os.Bundle;
    3. import android.support.annotation.Nullable;
    4. import android.support.v4.app.Fragment;
    5. import android.view.LayoutInflater;
    6. import android.view.View;
    7. import android.view.ViewGroup;
    8. import android.widget.Button;
    9. public class YourFragment extends Fragment {
    10. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    11. View contentView;
    12. contentView = inflater.inflate(R.layout.your_fragment, container, false);
    13. return contentView;
    14. }
    15. @Override
    16. public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    17. super.onActivityCreated(savedInstanceState);
    18. Button myReturn = (Button) getActivity().findViewById(R.id.my_return);
    19. myReturn.setOnClickListener(new View.OnClickListener() {
    20. //返回到上一个Fragment(同一个Activity中)
    21. @Override
    22. public void onClick(View v) {
    23. getActivity().getSupportFragmentManager().popBackStack();
    24. }
    25. });
    26. }
    27. }

    activity_main.xml:

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:orientation="vertical"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent">
    5. <FrameLayout
    6. android:id="@+id/fragment_container"
    7. android:layout_width="match_parent"
    8. android:layout_height="0dp"
    9. android:layout_weight="1"/>
    10. LinearLayout>

    activity_other.xml:

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:orientation="vertical"
    3. android:id="@+id/activity_other"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:background="#d0ff05"
    7. >
    8. <FrameLayout
    9. android:id="@+id/frame_container"
    10. android:layout_width="match_parent"
    11. android:layout_height="0dp"
    12. android:layout_weight="1">
    13. <LinearLayout
    14. android:orientation="vertical"
    15. android:layout_width="match_parent"
    16. android:layout_height="match_parent">
    17. <TextView
    18. android:layout_width="match_parent"
    19. android:layout_height="wrap_content"
    20. android:text="OtherActivity"
    21. android:textSize="50sp"
    22. android:gravity="center_horizontal"/>
    23. <Button
    24. android:id="@+id/to_MainActivity_YourFragment"
    25. android:layout_width="wrap_content"
    26. android:layout_height="wrap_content"
    27. android:text="To MainActivity YourFragment"
    28. android:textAllCaps="false"/>
    29. <Button
    30. android:id="@+id/to_OtherFragment"
    31. android:layout_width="wrap_content"
    32. android:layout_height="wrap_content"
    33. android:text="To OtherFragment"
    34. android:textAllCaps="false"/>
    35. <Button
    36. android:id="@+id/back"
    37. android:layout_width="wrap_content"
    38. android:layout_height="wrap_content"
    39. android:text="back"/>
    40. LinearLayout>
    41. FrameLayout>
    42. LinearLayout>

    my_fragment.xml:

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:orientation="vertical"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent">
    5. <TextView
    6. android:layout_width="match_parent"
    7. android:layout_height="wrap_content"
    8. android:text="MyFragment"
    9. android:textSize="40sp"
    10. android:gravity="center_horizontal"/>
    11. <Button
    12. android:id="@+id/my_button"
    13. android:layout_width="wrap_content"
    14. android:layout_height="wrap_content"
    15. android:textAllCaps="false"
    16. android:text="To YourFragment"/>
    17. <Button
    18. android:id="@+id/my_other"
    19. android:layout_width="wrap_content"
    20. android:layout_height="wrap_content"
    21. android:textAllCaps="false"
    22. android:text="To OtherActivity"/>
    23. LinearLayout>

    other_fragment.xml:

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:orientation="vertical"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:background="#ffffff">
    6. <TextView
    7. android:layout_width="match_parent"
    8. android:layout_height="wrap_content"
    9. android:text="OtherFragment"
    10. android:textSize="40sp"
    11. android:gravity="center_horizontal"/>
    12. <Button
    13. android:id="@+id/to_button"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:textAllCaps="false"
    17. android:text="To MainActivity YourFragment"/>
    18. LinearLayout>

    your_fragment.xml:

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:orientation="vertical"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:background="#0fa345">
    6. <TextView
    7. android:layout_width="match_parent"
    8. android:layout_height="wrap_content"
    9. android:gravity="center_horizontal"
    10. android:textSize="40sp"
    11. android:text="YourFragment"/>
    12. <Button
    13. android:id="@+id/my_return"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:text="RETURN"
    17. />
    18. LinearLayout>

    参考:Android Fragment的四种跳转

  • 相关阅读:
    go.mod 文件的作用
    Gimbal Lock欧拉角死锁问题
    【SQL引擎 - analyze.cpp分析(二)】
    Vue-Cli - Vue 脚手架的创建 以及 目录结构说明
    【MySQL】SQL语句优化
    45 万用户受影响,Mozilla封杀Firefox恶意组件
    python-2.变量和简单数据类型
    计算机网络——TCP/IP模型
    日常学习收获之----react的ref和wrappedComponentRef的区别
    【无标题】
  • 原文地址:https://blog.csdn.net/m0_61465701/article/details/126145181