**ps:** 参考的链接:https://www.jianshu.com/p/ab1cb7ddf91f
一、简介
经过上一次的安卓作业后,自己被自己创建的Activity和Fragment的各种跳转,搞得可谓是晕头转向的,虽然总的跳转也不多,但是经常跳来跳去的,就有点不知所措了,所以就想写一篇文章来介绍一下有关Activity和Fragment之间的五种跳转方式:
- 从一个Activity跳转到另一个Activity
-
从同一个Activiy的一个Fragment跳转到另外一个Fragment
-
从一个Activity的Fragment跳转到另外一个Activity
- 从一个Activity跳转到另外一个Activity的Fragment上
- 从一个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:**这是本人第一次写博客,由于以前都没有经验,故参考了开头注解的那个链接作者的文章,也是根据自己学的课程来写了更适合初学者来学习的跳转文章,如果有写的不好的地方还望各位多多指教。