一、加载fragment的两种方式
(1)在所寄生的Activity的layout文件中声明
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="com.example.news.ArticleListFragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.news.ArticleReaderFragment" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>每个fragment都要有唯一的标识,id或者tag属性,如果这两个都没有,那么就只能用container的id了
(2)可以在程序当中给一个已经存在的ViewGroup添加一个fragment。
FragmentManager fragmentManager =getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction()
;
ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit();
add方法的第一个参数是容器,第二个是所要添加的fragment实例
(3)加载一个没有UI的fragment
可以参考这个,我也不知道用来干嘛的http://blog.csdn.net/think_soft/article/details/7272847
二、处理fragment
通过FragmentManager对象处理,而FragmentManager对象则是通过方法getFragmentManager得到。
FragmentManager能够做的事情有
(1)获取fragment对象:findFragmentById()或findFragmentByTag()
(2)从后台栈中弹出fragment :popBackStack()
(3)注册一个后台栈(back stack)变化的监听器:addOnBackStackChangedListener()
(4)如上面的代码所示,还能开启一个事务:
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction()
;
三、处理FragmentTransaction
(1)获取FragmentTransaction
FragmentManager fragmentManager =getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction()
;
(2)可以调用 add()
, remove()
, and replace()等方法进行修改,然后不要忘记commit。
(3)如果要保存修改之前的状态,可以在commit之前调用addToBackStack方法,这样在按返回键的时候就会回到修改之前的状态。
(4)如果你一次修改了好几个fragment,如果addToBackStack之后,那么返回时所有的修改的fragment的以前的状态都会被保存;如果对一个fragment做了好几个修改,那么返回时就会按照修改的顺序重新回到以前的状态(这个说的不太清楚)
(5)还可以添加动画Tip: For each fragment transaction, you can apply a transition animation, by calling
setTransition()
before you commit.
(6)commit()不会被立刻被执行,因为他是在UI线程当中,只有UI线程可以的时候才会执行。如果要立即执行,可以调用executePendingTransactions()
四、fragment还可以对Activity当中的选项菜单和上下文菜单进行响应,通过调用setHasOptionsMenu()
during onCreate()。
五、对fragment的修改等操作是不会加入到后台栈当中,除非你明确的调用了addToBackStack()方法
六、fragment对应activity的生命周期