1:fragment被放在Activity里面,作为activity的一部分,和fragment交互通过FragmentManager
FragmentManager的获取api: 在activity和fragment里面一样
getFragmentManager();
getSupportFragmentManager //v4中FragmentActivity
activity和fragment的生命周期一致,
1:Fragment里面务必有一个无参的构造函数
onAttach
onCreate
onCreateView
onActivityCreated
onViewStateRestored
onStart
onResume
onPause
onStop
onDestroyView
onDestroy
onDetach
fragment用法:
xml引入:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment class="com.example.android.apis.app.FragmentLayout$TitlesFragment" android:id="@+id/titles" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
一般情况下实例化一个Fragment对象的方式:
public static class CountingFragment extends Fragment { int mNum; /** * Create a new instance of CountingFragment, providing "num" * as an argument. */ static CountingFragment newInstance(int num) { CountingFragment f = new CountingFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } }
fm=getFragmentManager(); transaction=fm.beginTransaction(); fragmentOne=new FragmentOne(); fragmentTwo=new FragmentTwo(); fragmentThree= new FragmentThree(); fragmentFour= new FragmentFour(); transaction.add(R.id.id_content,fragmentOne); transaction.commit();
activity和Fragment传递参数:
fragmentOne=new FragmentOne(); Bundle bundle1=new Bundle(); bundle1.putString("from","one"); fragmentOne.setArguments(bundle1);
在Fragment的onCreate里面获取参数
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNum = getArguments() != null ? getArguments().getInt("num") : 1; }
横竖屏切换(模拟Activity的异常重启)
现象:我们发现Activity里的Fragment数量在不断的增加。
//判断一下是否有状态保存进来的
作者:梦想编织者灬小楠
链接:https://www.jianshu.com/p/5761ee2d3ea1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
{ super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState == null)
{ getSupportFragmentManager().beginTransaction().add(R.id.fl_main, new ContentFragment(), null).commit(); }
//Activity在每次异常退出前,移除当前所有的Fragment。
@Override protected void onSaveInstanceState(Bundle outState) {
if(getSupportFragmentManager().findFragmentById(R.id.fl_main) != null) { getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentById(R.id.fl_main)).commit(); } super.onSaveInstanceState(outState); }
addToBackStack(String name)
方法作用:记录已提交的事务(transation),可用于回退操作。
参数说明:name是这次回退操作的一个名称(或标识),不需要可以传null。
第1次按下手机的back键,程序没有退出而是变成了白板,其实是回退了之前的add操作,相当于没有添加Fragment。
第2次按下手机的back键,因为当前回退栈已空,程序就直接退出了。
6. setCustomAnimations(int enter, int exit)、setCustomAnimations(int enter, int exit, int popEnter, int popExit)
API文档说明:为Fragment的进入/退出设置指定的动画资源。
补充:
该方法用于给Fragment设置自定义切换动画。
四个参数方法的后两个参数也是传入指定动画资源,在某个事务被addToBackStack或回退时起动画效果。
getSupportFragmentManager不支持属性动画,仅支持补间动画。getFragmentManager支持属性动画。
使用setCustomAnimations一定要放在add、remove...等操作之前。
commit():安排一个事务的提交。
commitAllowingStateLoss():和commit一样,但是允许Activity的状态保存之后提交。
Inflate()方法中有三个参数:
<1> layout的资源ID;
<2> 存放fragment的layout的ViewGroup;
<3> 布尔数据表示是否在创建fragment的layout期间,把layout附加到container上(在这个例子中,因为系统已经把layout插入到container中了,所以值为false,如果为true会导致在最终的layout中创建多余的ViewGroup)。