Bootstrap

Activity和Fragment之间的五种跳转方式

**ps:** 参考的链接:https://www.jianshu.com/p/ab1cb7ddf91f

一、简介

经过上一次的安卓作业后,自己被自己创建的Activity和Fragment的各种跳转,搞得可谓是晕头转向的,虽然总的跳转也不多,但是经常跳来跳去的,就有点不知所措了,所以就想写一篇文章来介绍一下有关Activity和Fragment之间的五种跳转方式:

  1. 从一个Activity跳转到另一个Activity
  2. 从同一个Activiy的一个Fragment跳转到另外一个Fragment

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

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

二、准备工作(两个Activity和三个Fragment)

**ps:**  准备工作将以自己本次作业作为案例

1、布局

在MainActivity的布局文件中写一个子布局

 android:id="@+id/layout"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

2、创建两个java类文件继承v4包的Fragment,并重写onCreateView方法引用对应的Fragment布局文件(这里以其中一个为例)

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(contentView == null) {  
    contentView = inflater.inflate(R.layout.my_fragment, container, false);   
    Button myButton = (Button) contentView.findViewById(R.id.my_button);        
    Button myReturn = (Button) contentView.findViewById(R.id.my_return);     
    Button myOther = (Button) contentView.findViewById(R.id.my_other);    
    myButton.setOnClickListener(this);  
    myReturn.setOnClickListener(this);     
    myOther.setOnClickListener(this); 
 }  
    return contentView;
}

3、在MainActivity中先添加进一个Fragment进行最开始的展示(压栈式添加)

getSupportFragmentManager()

getSupportFragmentManager().beginTransaction()
         .add(R.id.constraintLayout,gameFragment)
         .commit();
getSupportFragmentManager().beginTransaction()
         .add(R.id.constraintLayout,quziFragment)
         .commit();
getSupportFragmentManager().beginTransaction()
         .add(R.id.constraintLayout,myFragment)
         .commit();

4、在Fragment类中对几个按钮进行点击监听,在点击方法中对几个跳转进行操作

game.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction()
                        .show(Fragment1).hide(Fragment2).hide(Fragment3)
                        .commit();
            }
        });
quzi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction()
                        .show(Fragment2).hide(Fragment1).hide(Fragment3)
                        .commit();
            }
        });
my.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction()
                        .show(Fragment3).hide(Fragment1).hide(Fragment2)
                        .commit();
            }
        });

三、相关跳转操作

说明:

蓝颜色:所有Activity,Fragment或者按键的名称用该颜色表示

紫颜色:方法名(方法在上一个跳转说明中提到了就不再赘叙)用该颜色标识

1、从一个Activity跳转到另一个Activity

这个操作是最简单实现的,故不在此多做赘叙,详情请看以下代码:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MAinActivity.this, OtherActivity.class);
                //定义Intent,表示从MAinActivity跳转至OtherActivity去
                startActivity(intent);
            }
        });

说明:

button:是一个点击事件发生的按钮,用它代替所有的可点击的布局

MainActivity:当前所在Activity的名称

OtherActivity:要跳转的Activity的名称

Intent:Android中用于在不同组件之间传递信息的对象。它可以用来启动Activity、Service,或者发送广播等。

startActivity(intent):告诉系统你想要执行这个Intent所描述的操作。

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

由于此操作是在同一个Activity中实现的,故相对而言也比较简单,详情请看以下代码:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              getSupportFragmentManager().beginTransaction()
               .show(OtherFragment).hide(NowFragment) //展示OtherFragment,隐藏NowFragment
               .commit();
            }
        });

说明:

button:是一个点击事件发生的按钮,用它代替所有的可点击的布局

OtherFragment:要跳转的Fragment的名称

NowFragment:当前Activity所在的Fragment的名称

.show():你所想要展示的Fragment布局

.hide():你不想展示的(即你想隐藏的)的Fragment布局

getSupportFragmentManager():这是一个从FragmentActivity(或其子类,如AppCompatActivity)中调用的方法。它返回一个FragmentManager的实例,这个实例用于处理与Fragment相关的操作,如添加、移除、替换等。
beginTransaction():这是一个从FragmentManager中调用的方法。它返回一个FragmentTransaction对象,该对象允许你进行一系列的Fragment操作(如添加、移除、替换等),并最后通过commit()方法将这些操作应用到Activity上。

commit():执行之前通过FragmentTransaction对象添加、移除、替换或执行的其他Fragment操作。

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

此跳转与Activity之间的跳转如出一辙,只是引用上下文的时候,写成getActivity()即可!

例如从当前Fragment跳转到OtherActivity中去:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), OtherActivity.class);
                //定义Intent,表示当前Fragment跳转至OtherActivity去
                startActivity(intent);
            }
        });

说明:

button:是一个点击事件发生的按钮,用它代替所有的可点击的布局

getActivity() :该方法用于从Fragment中获取与其关联的Activity的一个方法。它返回一个Activity对象,这个对象代表了与Fragment关联的Activity。

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

例如OtherActivity现在展示的是NowFragment,我们要从MAinActivity跳转到OtherActivity的OtherFragment上去:
首先,我们在MAinActivity中的跳转事件中给MainActivity传递一个名为id的参数:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              Intent intent = new Intent(MAinActivity.this,OtherActivity.class);
                intent.putExtra("id",0);
                startActivity(intent);
            }
        });

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

int id = getIntent().getIntExtra("id",0);//用来获取MAinActivity传来的id值
if(id==1){
            getSupportFragmentManager()
               .beginTransaction()
               .show(OtherFragment).hide(NowFragment) //展示OtherFragment,隐藏NowFragment
               .addToBackStack(null)
               .commit();
        }

说明:

button:是一个点击事件发生的按钮,用它代替所有的可点击的布局

MAinActivity:当前Activity的名称

OtherActivity:要跳转的Activity的名称

OtherFrament:要跳转到OtherActivity的Fragment的名称

NowFragment:OtherFragment所展示的Fragment的名称

putExtra:这是 Intent 类的一个方法,用于向 Intent 中添加额外的数据。这个数据可以是各种类型,如基本数据类型(int, float, boolean等)、字符串(String)、可序列化的对象(Serializable)等。
"id":这是数据的键(key),用于在接收端检索这个数据。它是一个字符串,通常用于描述数据的类型或用途。
1:这是与 "id" 键关联的值(value)。

getIntExtra:这是 Intent 类的一个方法,用于获取 Intent 中添加的额外数据。

addToBackStack(String name):这是 FragmentTransaction 的一个方法,用于将当前的事务添加到后退栈中。当用户按下返回键时,系统会从后退栈中弹出并恢复上一个Fragment的状态。
null:在这个方法的参数中,你可以传递一个字符串作为此事务的名称。但是,在很多情况下,特别是当你只关心基本的后退栈功能时,你可以传递 null。传递 null 意味着这个事务没有特定的名称,但它仍然会被添加到后退栈中。

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

这种跳转与第四种跳转基本相似,只需将

Intent intent = new Intent(MAinActivity.this,OtherActivity.class)

更改成:

Intent intent = new Intent(getActivity(),OtherActivity.class)

细看便是将 MAinActivity.this 改成了 getActivity() ,其他不用变,详情请见第四种方法。

四、总结

自己本次安卓作业中用到的几种跳转就是以上这五种类型了,对于像我这种初学者一口气学这五中跳转难免会被搞的晕头转向,但是一旦自己多写几个案例,多用几次就会发现其实也不难。

**ps:**这是本人第一次写博客,由于以前都没有经验,故参考了开头注解的那个链接作者的文章,也是根据自己学的课程来写了更适合初学者来学习的跳转文章,如果有写的不好的地方还望各位多多指教。

;