Android Activity和Fragment之间的跳转方式
阅读数:427 评论数:0
跳转到新版页面分类
python/Java
正文
一、预备知识
Fragment必须嵌入到Activity中, 当Activity暂停时, 其中的所有片段也会暂停, 当Activity被销毁时,所有片段也会被销毁. 不过, 当Activity正在运行时,可以独立操纵每个Fragment, 如添加或移除它们. 当执行此类Fragment事务时, 也可以将其添加到由Acitivy管理的返回栈中.
通过扩展Fragment类或其子类来创建一个片段, 没有用户界面的片段, 充当该片段所嵌入到Activity的一个worker, 当作Activity的不可见工作线程.
要在一个Activity中使用片段, 可以选择在布局文件中使用Fragment元素来声明. 在android:name属性中指定要在布局中实例化的Fragment类, 并且用android:id属性指定一个标识符, 每个片段都需要一个唯一的标识符, 可以通过三种方式为Fragment提供id:
(1) 为android:id属性提供唯一id
(2)为android:tag属性提供唯一字符串
(3)如果未给以上两个属性提供值, 系统会使用容器视图的id
<fragment
android:id="@+id/fragment_select"
android:name="com.example.zy.myapplication.SelectFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
当系统创建Activity布局时, 会实例化在布局中指定的每个片段, 并为每个片段调用onCreateView()方法以检索每个片段的布局. 系统会直接插入片段返回的View来替代<Fragment>元素 .
此外, 也可以通过代码在Activity运行期间随时将Fragment添加到Activity布局中, 在Activity中通过使用FragmentManager来管理片段, 通过调用getFragmentManager()或者getSupportFragmentManager()来获取FragmentManager的实例, 然后在FragmentManager调用beginTransaction()方法来获取FragmentTransaction对象, 从而得以执行Fragment事务.
二、准备工作
1. 布局
在MainActivity的布局文件中写一个子布局
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
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()
.beginTransaction()
.replace(R.id.fragment_container,new MyFragment())
.addToBackStack(null)
.commit();
4. 在Fragment类中对几个按钮进行点击监听, 在点击方法对几个跳转进行操作(代码省略)
三、跳转方式
1、从同一个Activity的Fragment跳转到另一个Fragment
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.xx, new XxxFragment(), null)
.addToBackStack(null)
.commit();
说明:
R.id.xx: Fragment对应的Activity布局中FragmentLayout的id
new XxxFragment(): 要跳转到的Fragment
addToBackStack(null): 可以省略不写(不写表示为非压栈式添加)
2、从一个Activity的Fragment跳转到另外一个Activity
Intent intent = new Intent(getActivity(),OtherActivity.class);
startActivity(intent);
3、从一个Activity跳转到另外一个Activity的Fragment
Intent intent = new Intent(OtherActivity.this, MainActivity.class);
intent.putExtra("id",1);
startActivity(intent);
然后,我们在MainActivity里接收id值, 对值进行判断, 如果正确进行跳转操作:
int id = getIntent().getIntExtra("id", 0);
if (id == 1) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container,new YourFragment())
.addToBackStack(null)
.commit();
}
4、从一个Activity的Fragment跳转到另外一个Activity的Fragment上
这种跳转与第三种跳转极为类似, 我们只需要将上面的
Intent intent = new Intent(getActivity(), MainActivity.class);
写在对应的Fragment中, 其他不用改变.