1. 什么是Fragmentjava
Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分类似。Fragment是用来描述一些行为或一部分用户界面在一个Activity中,android
(1)你能够合并多个fragment在一个单独的activity中创建多个UI面板,ide
(2)同时重用fragment在多个activity中。布局
你能够认为fragment做为一个activity中的一节模块 ,fragment有本身的生命周期,接收本身的输入事件,你能够添加或移除从运行中的activity。xml
从中能够看出:一个fragment必须老是嵌入在一个activity中,同时fragment的生命周期 受 activity而影响。当activity 暂停,那么全部在这个activity的fragments将被destroy释放。blog
2. Fragment的生命周期生命周期
当fragment和activity被关联时调用。事件
当fragment建立时被调用,你应该初始化一些实用的组件,好比在fragment暂停或中止时须要恢复的utf-8
当系统调用fragment在首次绘制用户界面时,若是画一个UI在你的fragment你必须返回一个View固然了你能够返回null表明这个fragment没有UI.rem
public static class AndroidFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.android_fragment, container, false); } }
当activity的onCreate()方法返回时调用。
在running状态下的可见状态。
另外一个activity在前景运行,而且享有焦点,可是这个fragment所在的activity仍然可见(前景activity部分遮挡或者是半透明的)。
fragment不可见。多是由于宿主activity处于stopped状态,或者fragment被remove掉,而后加在了back stack中。
一个处于stopped状态的activity仍是存活状态的,全部的状态和成员信息会被系统保持。可是,它再也不被用户可见,而且若是宿主activity被kill掉,它也会被kill掉。
当fragment的UI被移除的时候调用。
当fragment和activity去关联时调用。
3. 建立Fragment
3.1 静态建立
3.1.1 activity_main.xml,在一个xml文件中建立了两个fragment
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <fragment android:id="@+id/fragment1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.egos.fragmentsample.Fragment1" /> <fragment android:id="@+id/fragment2" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.egos.fragmentsample.Fragment2" /> </LinearLayout>
3.1.2 分别建立两个Fragment
//Fragment1.java public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.fragment1, container, false); } }
//Fragment2.java public class Fragment2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.fragment1, container, false); } }
3.1.3 建立main.activity
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.activity_main); } }
3.2 动态建立
3.2.1 建立Fragment布局
//Fragment_dynamic.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is a fragment" /> </LinearLayout>
3.2.2 建立DynamicFragment.java
public class DynamicFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.fragment_dynamic, container, false); } }
3.2.3 建立main Activity布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"/> </LinearLayout>
3.2.4 建立MainActivity.java
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.activity_main2); if (arg0 == null) { getSupportFragmentManager().beginTransaction().add(R.id.container, new DynamicFragment()).commit(); } } }
4. Fragment与Activity
4.1 fragment显得更加灵活。能够直接在XML文件中添加<fragment/>,Activity则不能。
4.2 能够在一个界面上灵活的替换一部分页面,activity不能够,作不到。
4.3 fragment和Activity之间的通讯:(也就是控件的相互操控)
View listView = getActivity().findViewById(R.id.list);PS:在当前activity和fragment已经进行关联的状况下不然返回null。
xxxFragment xxx=getFragmentManager().findFragmentById();
4.4 fragment和Activity中控件的加载
Fragment的载入是经过OnCreateView的时候经过inflater.inflate()加载布局,而后经过修改main.xml,在main.xml上增长注册fragment标签,而后经过android:name来载入你已经经过inflater加载的隐藏布局。有几个关键点:fragment是经过inflater加载View而后在main.xml中注册获得的。固然若是你能够在fragment中获得View那就能够经过View.findViewId()来操控fragment上的具体控件。