Fragment是一种可以嵌入在活动当中的UI片段。它的生命周期如下:
Fragment有两种添加方式,一种是静态,一种是动态,静态使用的较少。
下面是动态Fragment的使用:
动态加载
步骤一:添加一个FragmentTransaction的实例
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
步骤二:用add()方法添加Fragment对象,其中R.id.container为xml中对应Fragment存放位置的容器的id
XxxFragment xxxFragment = new XxxFragment();
transaction.add(R.id.container,xxxFragment,"xxxFragment");
// 添加回退栈
transaction.addToBackStack(null);
步骤三:调用commit()方法使得FragmentTransaction实例的改变生效
FragmentPagerAdapter与FragmentStatePagerAdapter的区别:
FragmentStatePagerAdapter每次切换viewpager时回收内存,适用于页面较多的
情况。FragmentPagerAdapter不回收内存,只进行UI分离,适合页面比较少的情况。
Fragment通信
1.在Fragment中调用Activity中的方法,getActivity()方法。
2.在Activity中调用Fragment中的方法:接口回调,在Fragment中创建接口,在Activity中
实现接口。
3.在Fragment中调用Fragment中的方法,先通过getActivity()获取Activity中的方法,然后再通过findFragmentById或者findFragmentByTag获取另一个Fragment。
Fragment Arguments
使用Fragment启动另一个Activity:https://blog.csdn.net/myCSDN1997/article/details/83721159 详见RecyclerView使用。
使用Fragment获取其托管Activity中的数据:通过setArguments()和
getArguments()实现,具体如下所示:
1.在Fragment类中编写静态方法newInstance(Xxx xxx),参数为要获取的数据,返回一个
当前Fragment的实例,代码如下所示:
// 首先创建常量来表示key
private static final String ARG_XXX = "xxx";
// 编写方法newInstance(Xxx xxx)
public static XxxFragment newInstance(Xxx xxx){
Bundle args = new Bundle();
args.put(ARG_XXX, xxx);
XxxFragment = new XxxFragment();
fragment.setArguments(args);
return fragment;
}
2.在Activity中添加fragment的部分的new XxxFragment()改为XxxFragment.newInstance(xxx);
3.获取 arguments:在Fragment类的onCreate()方法中获取值,如下:
if (getArguments() != null) {
Xxx xxx = (Xxx) getArguments().getXxx(ARG_XXX);
}
通过 fragment 获取返回结果:可以调用Fragment的startActivityForResult()方法和Fragment的onActivityResult()方法。
注:fragment能够从activity中接收返回结果,但其自身无法持有返回结果。只有activity拥有返回结果。所以,fragment没有setResult()方法,所以要在fragment中通过getActivity().setResult(Activity.RESULT_OK, null);来设置返回结果。
Fragment中常用的方法:
replace()方法
add()方法
remove()方法
抽象Activity托管Fragment
通用型fragment托管布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Activity抽象超类来托管Fragment:
public abstract class SingleFragmentActivity extends AppCompatActivity {
protected abstract Fragment createFragment();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment == null) {
fragment = createFragment();
fm.beginTransaction()
.add(R.id.fragment_container, fragment)
.commit();
}
}
}
Activity控制类继承抽象超类:
public class CrimeListActivity extends SingleFragmentActivity {
@Override
protected Fragment createFragment() {
return new CrimeListFragment();
}
}
实现Fragment类:
public class CrimeListFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
View v = inflater.inflate(R.layout.fragment_xxx, container , false);
// 获取实例设置监听都在该方法中
return v;
}
}
最后在配置文件中配置Activity