评论

收藏

[Android] Fragment的四种跳转方式

移动开发 移动开发 发布于:2022-09-27 17:50 | 阅读数:558 | 评论:0

本文主要记录了关于fragment的四种跳转方式:
1、从同一个Activiy的一个Fragment跳转到另外一个Fragment 2、从一个Activity的Fragment跳转到另外一个Activity  3、从一个Activity跳转到另外一个Activity的Fragment上4、从一个Activity的Fragment跳转到另外一个Activity的Fragment上
写这篇文章只是一个简单的记录,当初我学这里的时候看别人的文章总是觉得云里雾里的,后来自己也觉得差不多可以了,于是写下这篇博客,也是记录自己的学习过程。
首先新建一个项目,然后新建两个活动MainActivity、OtherActivity。
在MainActivity的布局文件中写一个子布局:
1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3   android:orientation="vertical"
 4   android:layout_width="match_parent"
 5   android:layout_height="match_parent">
 6  
 7  
 8   <FrameLayout
 9     android:id="@+id/fragment_container"
10     android:layout_width="match_parent"
11     android:layout_height="0dp"
12     android:layout_weight="1"/>
13  
14  
15 </LinearLayout>
新建一个my_fragment.xml布局与MyFragment类
1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3   android:orientation="vertical"
 4   android:layout_width="match_parent"
 5   android:layout_height="match_parent">
 6  
 7   <TextView
 8     android:layout_width="match_parent"
 9     android:layout_height="wrap_content"
10     android:text="MyFragment"
11     android:textSize="40sp"
12     android:gravity="center_horizontal"/>
13  
14   <Button
15     android:id="@+id/my_button"
16     android:layout_width="wrap_content"
17     android:layout_height="wrap_content"
18     android:textAllCaps="false"
19     android:text="To YourFragment"/>
20  
21   <Button
22     android:id="@+id/my_other"
23     android:layout_width="wrap_content"
24     android:layout_height="wrap_content"
25     android:textAllCaps="false"
26     android:text="To OtherActivity"/>
27  
28 </LinearLayout>
MyFragment类就暂时省略了,后面会贴出所有代码。
在MainActivity中先添加进一个Fragment进行最开始的展示(压栈式添加)
1 public class MainActivity extends AppCompatActivity {
 2  
 3   @Override
 4   protected void onCreate(Bundle savedInstanceState) {
 5     super.onCreate(savedInstanceState);
 6     setContentView(R.layout.activity_main);
 7     getSupportFragmentManager()
 8         .beginTransaction()
 9         .replace(R.id.fragment_container,new MyFragment())
10         .addToBackStack(null)
11         .commit();
12  
13   }
14 }
从同一个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  
 8   @Override
 9   public void onActivityCreated(@Nullable Bundle savedInstanceState) {
10     super.onActivityCreated(savedInstanceState);
11     Button myReturn = (Button) getActivity().findViewById(R.id.my_return);
12     myReturn.setOnClickListener(new View.OnClickListener() {
13       //返回到上一个Fragment(同一个Activity中)
14       @Override
15       public void onClick(View v) {
16         getActivity().getSupportFragmentManager().popBackStack();
17       }
18     });
19   }
20 }
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       }
13     });
从一个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。
这种跳转与第三种跳转极为类似,我们只需要将上面的
1 Intent intent = new Intent(OtherActivity.this, MainActivity.class);
Intent intent = new Intent(OtherActivity.this, MainActivity.class);
关键代码如下:
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       
 6       @Override
 7       public void onClick(View v) {
 8         Intent intent = new Intent(getActivity(), MainActivity.class);
 9         intent.putExtra("id",1);
10         startActivity(intent);
11       }
12     });
13   }
所有代码文件
最后附上所有的代码文件。  
MainActivity:
1 package com.example.fragment_activity_skiptest;
 2  
 3 import android.content.Intent;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.os.Bundle;
 6 import android.view.View;
 7  
 8 public class MainActivity extends AppCompatActivity {
 9  
10   @Override
11   protected void onCreate(Bundle savedInstanceState) {
12     super.onCreate(savedInstanceState);
13     setContentView(R.layout.activity_main);
14     getSupportFragmentManager()
15         .beginTransaction()
16         .replace(R.id.fragment_container,new MyFragment())
17         .addToBackStack(null)
18         .commit();
19     int id = getIntent().getIntExtra("id", 0);
20     if (id == 1) {
21       getSupportFragmentManager()
22           .beginTransaction()
23           .replace(R.id.fragment_container,new YourFragment())
24           .addToBackStack(null)
25           .commit();
26     }
27  
28   }
29 }
MyFragment:
1 package com.example.fragment_activity_skiptest;
 2  
 3 import android.content.Intent;
 4 import android.os.Bundle;
 5 import android.support.annotation.Nullable;
 6 import android.support.v4.app.Fragment;
 7 import android.view.LayoutInflater;
 8 import android.view.View;
 9 import android.view.ViewGroup;
10 import android.widget.Button;
11  
12  
13 public class MyFragment extends Fragment {
14  
15   public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
16     View contentView;
17       contentView = inflater.inflate(R.layout.my_fragment, container, false);
18  
19     return contentView;
20   }
21  
22   @Override
23   public void onActivityCreated(@Nullable Bundle savedInstanceState) {
24     super.onActivityCreated(savedInstanceState);
25     Button myButton = (Button) getActivity().findViewById(R.id.my_button);
26  
27     Button myOther = (Button) getActivity().findViewById(R.id.my_other);
28     myButton.setOnClickListener(new View.OnClickListener() {
29       @Override
30       public void onClick(View v) {
31         /** 一、从同一个Activity的一个Fragment跳到另外一个Fragment*/
32         //压栈式跳转
33         getActivity().getSupportFragmentManager()
34             .beginTransaction()
35             .replace(R.id.fragment_container, new YourFragment(), null)
36             .addToBackStack(null)
37             .commit();
38  
39       }
40     });
41     myOther.setOnClickListener(new View.OnClickListener() {
42       /**
43        二、从一个Activity的Fragment跳转到另外一个Activity(等同于Activity之间的跳转(上下文是getActivity))
44        */
45       @Override
46       public void onClick(View v) {
47         Intent intent = new Intent(getActivity(),OtherActivity.class);
48         startActivity(intent);
49       }
50     });
51   }
52 }
OtherActivity:
1 package com.example.fragment_activity_skiptest;
 2  
 3 import android.content.Intent;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.widget.Button;
 8  
 9 public class OtherActivity extends AppCompatActivity {
10  
11   @Override
12   protected void onCreate(Bundle savedInstanceState) {
13     super.onCreate(savedInstanceState);
14     setContentView(R.layout.activity_other);
15     Button button = (Button)findViewById(R.id.to_MainActivity_YourFragment);
16     Button button_back = (Button)findViewById(R.id.back);
17     Button button_fm = (Button)findViewById(R.id.to_OtherFragment);
18     button.setOnClickListener(new View.OnClickListener() {
19       /*从一个Activity跳转到另外一个Activity的Fragment上
20       例如我们要从OtherActivity跳转到MainActivity的YourFragment上去:
21       首先,我们在OtherActivity中的跳转事件中给MainActivity传递一个名为id的参数:
22       然后,我们在MainActivity里接收id值,对值进行判断,如果正确进行跳转操作:
23       */
24       @Override
25       public void onClick(View v) {
26         Intent intent = new Intent(OtherActivity.this, MainActivity.class);
27         intent.putExtra("id",1);
28         startActivity(intent);
29  
30       }
31     });
32     button_back.setOnClickListener(new View.OnClickListener() {
33       @Override
34       public void onClick(View v) {
35         finish();
36       }
37     });
38     button_fm.setOnClickListener(new View.OnClickListener() {
39       @Override
40       public void onClick(View v) {
41         getSupportFragmentManager()
42             .beginTransaction()
43             .replace(R.id.frame_container, new OtherFragment(), null)
44             .addToBackStack(null)
45             .commit();
46       }
47     });
48   }
49 }
OtherFragment:
package com.example.fragment_activity_skiptest;
 
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
 
 
public class OtherFragment extends Fragment {
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View contentView;
    contentView = inflater.inflate(R.layout.other_fragment, container, false);
    return contentView;
  }
 
  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Button ToButton = (Button) getActivity().findViewById(R.id.to_button);
    ToButton.setOnClickListener(new View.OnClickListener() {
      /*4、从一个Activity的Fragment跳转到另外一个Activity的Fragment上
      这种跳转与第三种跳转极为类似,我们只需要将
      Intent intent = new Intent(OtherActivity.this, MainActivity.class);
      书写在对应的Fragment中,将OtherActivity.this更改为getActivity(),其他不用改变,几个完成跳转.
      */
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(getActivity(), MainActivity.class);
        intent.putExtra("id",1);
        startActivity(intent);
      }
    });
  }
}
YourFragment:
package com.example.fragment_activity_skiptest;
 
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
 
 
public class YourFragment extends Fragment {
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View contentView;
    contentView = inflater.inflate(R.layout.your_fragment, container, false);
    return contentView;
  }
 
  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Button myReturn = (Button) getActivity().findViewById(R.id.my_return);
    myReturn.setOnClickListener(new View.OnClickListener() {
      //返回到上一个Fragment(同一个Activity中)
      @Override
      public void onClick(View v) {
        getActivity().getSupportFragmentManager().popBackStack();
      }
    });
  }
}
activity_main.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">
 
 
  <FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>
 
 
</LinearLayout>
activity_other.xml:
1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3   android:orientation="vertical"
 4   android:id="@+id/activity_other"
 5   android:layout_width="match_parent"
 6   android:layout_height="match_parent"
 7   android:background="#d0ff05"
 8   >
 9  
10   <FrameLayout
11     android:id="@+id/frame_container"
12     android:layout_width="match_parent"
13     android:layout_height="0dp"
14     android:layout_weight="1">
15     <LinearLayout
16       android:orientation="vertical"
17       android:layout_width="match_parent"
18       android:layout_height="match_parent">
19  
20       <TextView
21         android:layout_width="match_parent"
22         android:layout_height="wrap_content"
23         android:text="OtherActivity"
24         android:textSize="50sp"
25         android:gravity="center_horizontal"/>
26  
27       <Button
28         android:id="@+id/to_MainActivity_YourFragment"
29         android:layout_width="wrap_content"
30         android:layout_height="wrap_content"
31         android:text="To MainActivity YourFragment"
32         android:textAllCaps="false"/>
33  
34       <Button
35         android:id="@+id/to_OtherFragment"
36         android:layout_width="wrap_content"
37         android:layout_height="wrap_content"
38         android:text="To OtherFragment"
39         android:textAllCaps="false"/>
40  
41       <Button
42         android:id="@+id/back"
43         android:layout_width="wrap_content"
44         android:layout_height="wrap_content"
45         android:text="back"/>
46  
47     </LinearLayout>
48   </FrameLayout>
49  
50  
51  
52 </LinearLayout>
my_fragment.xml:
1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3   android:orientation="vertical"
 4   android:layout_width="match_parent"
 5   android:layout_height="match_parent">
 6  
 7   <TextView
 8     android:layout_width="match_parent"
 9     android:layout_height="wrap_content"
10     android:text="MyFragment"
11     android:textSize="40sp"
12     android:gravity="center_horizontal"/>
13  
14   <Button
15     android:id="@+id/my_button"
16     android:layout_width="wrap_content"
17     android:layout_height="wrap_content"
18     android:textAllCaps="false"
19     android:text="To YourFragment"/>
20  
21   <Button
22     android:id="@+id/my_other"
23     android:layout_width="wrap_content"
24     android:layout_height="wrap_content"
25     android:textAllCaps="false"
26     android:text="To OtherActivity"/>
27  
28 </LinearLayout>
other_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:background="#ffffff">
 
 
 
  <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="OtherFragment"
    android:textSize="40sp"
    android:gravity="center_horizontal"/>
 
  <Button
    android:id="@+id/to_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAllCaps="false"
    android:text="To MainActivity YourFragment"/>
 
</LinearLayout>
your_fragment.xml:
1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3   android:orientation="vertical"
 4   android:layout_width="match_parent"
 5   android:layout_height="match_parent"
 6   android:background="#0fa345">
 7  
 8   <TextView
 9     android:layout_width="match_parent"
10     android:layout_height="wrap_content"
11     android:gravity="center_horizontal"
12     android:textSize="40sp"
13     android:text="YourFragment"/>
14  
15   <Button
16     android:id="@+id/my_return"
17     android:layout_width="wrap_content"
18     android:layout_height="wrap_content"
19     android:text="RETURN"
20     />
21  
22 </LinearLayout>
参考:Android Fragment的四种跳转
我的CSDN:Fragment的四种跳转方式_SY_XLR的博客-CSDN博客_fragment跳转