您的位置:首页 > 移动开发 > Android开发

Android之Fragment

2016-03-08 15:45 525 查看
1、Fragment的生命周期

2、在xml文件中使用fragment

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<fragment

android:id="@+id/id_fragment_title"

android:name="com.zhy.zhy_fragments.TitleFragment"

android:layout_width="fill_parent"

android:layout_height="45dp" />

3、Fragment常用的三个类和方法:

android.app.Fragment 主要用于定义Fragment

android.app.FragmentManager 主要用于在Activity中操作Fragment

android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白~

a、获取FragmentManage的方式:

getFragmentManager() // v4中,getSupportFragmentManager

b、主要的操作都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

transaction.add()

往Activity中添加一个Fragment

transaction.remove()

从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

transaction.replace()

使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

transaction.hide()

隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

transaction.show()

显示之前隐藏的Fragment

detach()

会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

attach()

重建view视图,附加到UI上并显示。

transatcion.commit()//提交一个事务

4、管理Fragment回退栈

如何添加一个Fragment事务到回退栈:

FragmentTransaction.addToBackStack(String)

@Override

public void onClick(View v)

{

FragmentTwo fTwo = new FragmentTwo();

FragmentManager fm = getFragmentManager();

FragmentTransaction tx = fm.beginTransaction();

tx.replace(R.id.id_content, fTwo, "TWO");

tx.addToBackStack(null);

tx.commit();

}

replace是remove和add的合体;我们调用tx.addToBackStack(null);将当前的事务添加到了回退栈,所以FragmentOne实例不会被销毁,但是视图层次依然会被销毁,即会调用onDestoryView和onCreateView,

5、当屏幕发生旋转,Activity发生重新启动,默认的Activity中的Fragment也会跟着Activity重新创建;这样造成当旋转的时候,本身存在的Fragment会重新启动,然后当执行Activity的onCreate时,又会再次实例化一个新的Fragment。

那么如何解决呢:

其实通过检查onCreate的参数Bundle savedInstanceState就可以判断,当前是否发生Activity的重新创建:

默认的savedInstanceState会存储一些数据,包括Fragment的实例:通过打印可以看出:

[java] view
plain copy







07-20 08:23:12.952: E/FragmentOne(1782): Bundle[{android:fragments=android.app.FragmentManagerState@40d0b7b8, android:viewHierarchyState=Bundle[{android:focusedViewId=2131230721, android:views=android.util.SparseArray@40d0af68}]}]

所以,我们简单改一下代码,只有在savedInstanceState==null时,才进行创建Fragment实例:

if(savedInstanceState == null)

{

mFOne = new FragmentOne();

FragmentManager fm = getFragmentManager();

FragmentTransaction tx = fm.beginTransaction();

tx.add(R.id.id_content, mFOne, "ONE");

tx.commit();

}

学习的博客:
http://blog.csdn.net/lmj623565791/article/details/37970961 http://blog.csdn.net/lmj623565791/article/details/37992017 http://blog.csdn.net/lmj623565791/article/details/37815413
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: