你可以认为一个fragment可以作为activity的一个模块化部分,拥有自身的生命周期,接收自身的输入事件,且在activity运行期间,还可以增加和移除(这个有点像一个"activity子类",在不同的activity之间可以重用它).这节课我们学会使用支持库怎么扩展Fragment类,所以你的APP需要保持兼容运行在Android1.6+设备上.
在这节课开始之前,你必须设置你的android项目使用支持库.如果你没有使用支持库,按照"支持库设置"文档,设置你得项目使用v4库.不管怎么样,你也可以在activity中包含action bar,但是使用v7 appcompat库,这兼容android2.1(API level 7)且也包含Fragment API.
创建一个Fragment类
创建一个Fragment的子类,覆盖关键生命周期的方法,类似使用Activity类的方式.
一个不同点就是创建Fragment后,必须实现使用onCreateView()调用定义的layout.事实上,这个调用是必须的,为了fragment的运行.例如,这里是一个简单的fragment,指定自己的layout:
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.ViewGroup; public class ArticleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.article_view, container, false, 0, 0); } }
像一个activity,fragment需要实现生命周期回调,允许你去管理它的状态,作为它从activity中添加和移除,也可以作为activity的生命周期状态的改变.例如,当activity的onPause()方法调用,任何fragment也接收 onPause()调用.
更多的关于fragment的生命周期和有效的回调方法,在 Fragments 开发指南里
添加一个fragment到activity,使用XML
当fragment被重用,模块UI组件,每一个Fragment实例,必须与父类FragmentActivity关联.你可以通过定义每一个fragment到activity layout XML文件里,实现关联性.
这里一个layout文件例子,添加两个fragment到activity中,设备屏幕被指定为"large"(通过 large 限定词来指定到文件目录名中).
res/layout-large/news_articles.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment android:name="com.example.android.fragments.HeadlinesFragment" android:id="@+id/headlines_fragment" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.android.fragments.ArticleFragment" android:id="@+id/article_fragment" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
然后应用layout到你的activity:
import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, 0, 0); setContentView(R.layout.news_articles, 0, 0); } }
如果使用 v7 appcompat library,你的activity应该继承ActionBarActivity,它使FragmentActivity的子类(更多的信息,查阅 添加Action Bar)