一 Activity中添加Fragment方式
(1)Xml布局文件添加,如下
<fragment
android:id="@+id/fragment"
android:name="xxx.xxx.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
(2)View中动态添加
Fragment fragment = getSupportFragmentManager().findFragmentByTag("tag");
if(fragment == null){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
fragment = MyFragment.newInstance();
transaction.add(R.id.fragment_container, fragment, "tag");
transaction.commit();
}
或
Fragment fragment = null;
if(savedInstanceState == null){
fragment = MyFragment.newInstance();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.fragment_container, fragment, "tag");
transaction.commit();
}else{
fragment = getSupportFragmentManager().findFragmentByTag("tag");
}
之所以在添加Fragment前判断是否有存在相同的Fragment,是因为在内存不足或横竖屏切换(如未在android:configChanges设置)时,会保存其内的Fragment状态信息。当Activity被创建显示时,Fragment会被自动恢复(恢复Fragment和状态的代码在Fragment Activity的onCreate方法中)。如果不判断,则添加多个相同的Fragment。
在添加Fragment时,如果需要向其传递一些初始化的参数,则可使用Bundle来传递。在Fragment内使用getArguments()获取参数。代码如下:
//------ 传递参数 ------
Bundle data = new Bundle();
//除了基本数据类型的值,还可以传递序列化和实现Parcelable类型的数据
data.putString(key, value);
...
fragment.setArguments(data);
//------ 获取参数 ------
Bundle data = getArguments();
if(data != null){
//获取参数
String value = data.getString(key);
...
}
(3)使用TabLayout和ViewPager添加
在布局文件添加:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="40dp" />
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"