Fragment详解

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数量在不断的增加。

原因:其实,当我们Activty被异常销毁时,Activity会对自身状态进行保存(这里面包含了我们添加的Fragment)。在Activity被重新创建时,又对我们之前保存的Fragment进行了恢复,但是我们在onCreate时却又添加了1次Fragment,所以我们的Fragment数量在不断增加...

//判断一下是否有状态保存进来的
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState == null) { getSupportFragmentManager().beginTransaction().add(R.id.fl_main, new ContentFragment(), null).commit(); }


作者:梦想编织者灬小楠
链接:https://www.jianshu.com/p/5761ee2d3ea1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState == null) { getSupportFragmentManager().beginTransaction().add(R.id.fl_main, new ContentFragment(), null).commit(); }



protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState == null) { getSupportFragmentManager().beginTransaction().add(R.id.fl_main, new ContentFragment(), null).commit(); }



protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState == null) { getSupportFragmentManager().beginTransaction().add(R.id.fl_main, new ContentFragment(), null).commit(); }



protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState == null) { getSupportFragmentManager().beginTransaction().add(R.id.fl_main, new ContentFragment(), null).commit(); }



protected void onCreate(Bundle savedInstanceState)
{ 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)
  1. 方法作用:记录已提交的事务(transation),可用于回退操作。

  2. 参数说明:name是这次回退操作的一个名称(或标识),不需要可以传null。

我们如果按下手机的back键,Activity会回调onBackPressed()方法.

  • 第1次按下手机的back键,程序没有退出而是变成了白板,其实是回退了之前的add操作,相当于没有添加Fragment。

  • 第2次按下手机的back键,因为当前回退栈已空,程序就直接退出了。


6. setCustomAnimations(int enter, int exit)、setCustomAnimations(int enter, int exit, int popEnter, int popExit)

API文档说明:为Fragment的进入/退出设置指定的动画资源。

补充:

  1. 该方法用于给Fragment设置自定义切换动画。

  2. 四个参数方法的后两个参数也是传入指定动画资源,在某个事务被addToBackStack或回退时起动画效果。

  3. getSupportFragmentManager不支持属性动画,仅支持补间动画。getFragmentManager支持属性动画。

  4. 使用setCustomAnimations一定要放在add、remove...等操作之前。


getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.enter_anim, R.anim.exit_anim) .add(R.id.fl_main, new ContentFragment(), null) .commit();



 getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.enter_anim, R.anim.exit_anim) .add(R.id.fl_main, new ContentFragment(), null) .commit();


  1. commit():安排一个事务的提交。

  2. commitAllowingStateLoss():和commit一样,但是允许Activity的状态保存之后提交。


Inflate()方法中有三个参数:

  <1> layout的资源ID;

  <2> 存放fragment的layout的ViewGroup;

  <3> 布尔数据表示是否在创建fragment的layout期间,把layout附加到container上(在这个例子中,因为系统已经把layout插入到container中了,所以值为false,如果为true会导致在最终的layout中创建多余的ViewGroup)。















   





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Activity中添加Fragment,需要按照以下步骤: 1. 创建一个Fragment类:创建一个继承自Fragment的类,并实现它的生命周期方法。 2. 在Activity中创建一个布局:创建一个布局文件,并在其中添加一个FrameLayout,用于放置Fragment。 3. 在Activity中获取FragmentManager:获取FragmentManager实例,用于管理Fragment。 4. 在Activity中创建Fragment实例:创建Fragment实例,并将其添加到FragmentManager中。 5. 在Activity中将Fragment添加到布局中:使用FragmentTransaction将Fragment添加到FrameLayout中。 以下是一个示例代码,用于在Activity中添加Fragment: 首先,在Activity中创建一个布局文件,例如: ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> ``` 接下来,在Activity中获取FragmentManager并创建Fragment实例: ``` FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); MyFragment myFragment = new MyFragment(); fragmentTransaction.add(R.id.fragment_container, myFragment); fragmentTransaction.commit(); ``` 在这个示例中,我们获取了SupportFragmentManager并创建了一个FragmentTransaction。然后,我们创建了一个MyFragment实例,并使用add()方法将其添加到布局中。最后,我们必须调用commit()方法以提交FragmentTransaction。 这就是如何在Activity中添加Fragment的基本步骤。请注意,您需要在MyFragment类中实现它的生命周期方法,以便正确管理Fragment
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值