同长一个fragment作为一个activity UI的一部分,并嵌入到整个结构中。
两种方式 增加一个fragment到activity layout中:
4.1 在activity layout文件中声明fragment
<?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">
<fragmentandroid:name="com.example.news.ArticleListFragment"
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"/>
<fragmentandroid:name="com.example.news.ArticleReaderFragment"
android:id="@+id/viewer"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent"/>
</LinearLayout>
上面代码中的,android:name属性指定了这个layout被实例化的fragment类。
当系统创建这个activity layout,这个layout中的每个fragment都被实例化,并且每个fragment都调用onCreateView()方法,检索每个fragment的layout。 (“增加一个用户界面”已经提到onCreateView()方法返回的是一个View),系统直接插入这个返回的View到<fragment>元素,并替换这个<fragment>元素
每个fragment都需要一个独一无二的标示符,这样:
1如果activity被重新启动,系统就能够使用它来还原这个fragment,
2你可以捕获这个fragment,来对它进行一些处理,比如将他删除
有三种方式给一个fragment提供一个ID:
android:id, 独一无二的id
Androide:tag, du独一无二的String
如果你两种方式都没提供,体统会讲这个container view的ID给他
4.2 编程方式来增加fragment到一个已存在的ViewGroup
当你的activity运行的时候,你也能够增加fragments到你的activity layout。你只要指定一个ViewGroup(用来存放fragment的layout)
要对fragment进行操作(e.g.: add, remove, replace fragment),你都必须使用FragmentTransaction 的APIs(这边的Transaction 翻译成事物,一个事物中可以进行很多操作,这些操作都看做是绑定在一起的,只要一个操作出现了问题,所有的操作都失效). 你可以从你的activity中获得FragmentTransaction的实例。
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
你可以使用add()方法来增加一个fragment,指定要增加的view,还有存放这个view的view
ExampleFragment fragment =new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
add()的第一个参数是ViewGroup, 通过source ID指定,第二个参数是要添加的这个fragment,一旦你对FragmentTransaction做了改动,你必须调用commit()来提交这些改变。
4.3 增加一个没有UI的fragment
有时我们需要activity背后的行为,而不用展示额外的UI.
要增加一个没有UI的fragment,来自activity的fragment使用add(Fragment,String),给fragment提供一个独一无二的String “tag”而不是view ID. 这个增加了fragment,但是由于他跟activity layout中的一个view无关,他不接收onCreateView()的调用,因此你不需要实现这个方法。
提供一个String tag给fragment对non-UI fragment不是不许的,你也可以提供String tags 给那些有UI的fragment,但是对那些没有UI的fragment, string tag 是识别他们的唯一的方式。如果你以后想从activity
得到这个fragment,你需要使用findFragmentByTag()