非专业人士蹩脚翻译,原文详见 —— [ Android Developer ]
你可以认为一个fragment就是一个具有自我生命周期的activity模块,该模块可以独立接收事件,并且在activity运行时的任意时刻,你都可以将其添加进来或者移除(某种程度上来说可以理解为“子程序”)。本课程将展示如何通过支持库来拓展一个Fragment,最低可兼容版本为Android 1.6的Android系统。
在开始课程之前,你需要将你的Android项目设置为使用支持库.如果你之前没有使用过支持库,请设置你的项目使用v4版本库,详情参见支持库设置。除此之外,你还可以通过v7版本库的菜单栏来代替fragment,该版本库兼容至Android 2.1同样也包含fragment的APIs。
创建一个Fragment类
创建一个fragment,拓展fragment类,然后重写它的关键生命周期函数并加入到你的程序逻辑中,就像你写activity类一样。
唯一的不同就是在创建fragment类的时候你必须使用 onCreateView()回调来定义布局。事实上,这也是让fragment能够运行起来的唯一回调。
例如下面的fragment代码展示了一种布局:
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);
}
}
就像一个activity,一个fragment也应该实现他的回调,这样在你的程序运行时就可以管理fragment的状态,在你需要的时候移除或者添加fragment,在你的activity在状态转变时候,fragment也应同样改变。例如在你activity执行onPause()函数的时候,fragment同样也应该执行onPause()。
更多关于fragment生命周期和回调函数可以参见Fragment开发指南。
使用XML为Activity添加Fragment
每一个实例化的Fragment都必须关联一个父类FragmentActivity,使其可重复使用同时成为一个模块化的UI组件。你可以实现这种关联通过你的XML文件。
注意:FragmentActivity只是用于Android API level 11及以下版本,11及以上版本使用Activity。
以下是大屏幕设备(限定词为“large”)的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>
Tips:对不同尺寸屏幕设备的设置详见 [ 支持不同屏幕尺寸 ]
然后将布局应用到你的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);
setContentView(R.layout.news_articles);
}
}
如果你使用的是v7版本菜单栏库,Fragment将被 AppCompatActivity代替。如何添加菜单栏,请见《Android开发入门-添加菜单栏》(还没写,先预定位置,哈哈:))或者原文。
注意:当你用XML布局文件的方式将Fragment添加进activity时,你的Fragment是不能被动态移除的。如果你想要在用户交互的时候把fragment切入与切出,你必须在activity启动后,再将fragment添加进activity。