Fragment是在Android3.0(即API 11)才出现的,如果在之前的版本要使用,需要添加support库。
Fragment可以认为是Actvity模块化的组件,可以很方便地被添加,删除,替换到Activity的视图结构中。通过FragmentTransaction来执行这些操作。
Fragment还有个重要的特点是:拥有自己的生命周期,受Activity直接影响。
MainActivity直接继承了FragmentActivity(support库中的)。
因为API 11之前的Activity无法获取到FragmentManager。在FragmentActivity中可以使用getSupportFragmentManager()。
如果使用的是API 11以上的,可直接从Activity.getFragmentManager()获得,即无需继承FragmentActivity了。
向Activity添加Fragment的方式:
1.Activity布局文件中使用<Fragment>属性;
2.代码中,通过FragmentTransaction可以添加、删除、替换Fragment。
下面的例子,是在代码中添加Fragment。
1 package com.dann.fragmentdemo; 2 3 import android.os.Bundle; 4 import android.support.v4.app.Fragment; 5 import android.support.v4.app.FragmentActivity; 6 import android.support.v4.app.FragmentManager; 7 import android.support.v4.app.FragmentTransaction; 8 import android.view.LayoutInflater; 9 import android.view.View; 10 import android.view.ViewGroup; 11 12 public class MainActivity extends FragmentActivity { 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main);// Activity的布局 18 19 Fragment fragment = new MyFragement(); 20 FragmentManager fragmentManager = getSupportFragmentManager(); 21 FragmentTransaction transaction = fragmentManager.beginTransaction();// 打开事务 22 transaction.add(R.id.fragment_container, fragment);// 向View容器添加Fragment。两个参数:容器(ViewGroup)的标识,添加的fragment 23 transaction.commit();// 提交事务 24 25 } 26 27 /** 28 * 如果Fragment是有界面的(可以没),就需要继承onCreateView()方法,返回表示Fragment界面的View 29 * 30 */ 31 public static class MyFragement extends Fragment { 32 33 @Override 34 public View onCreateView(LayoutInflater inflater, ViewGroup container, 35 Bundle savedInstanceState) { 36 ViewGroup root = (ViewGroup) inflater.inflate( 37 R.layout.fragment_layout, null); 38 39 return root; 40 } 41 42 } 43 }
layout_main.xml
根View是LinearLayout,背景色为红色;两个子View,分别是LinearLayout和FrameLayout,大小相同,其中的FrameLayout是提供Fragment存放的容器。
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:background="#FF0000" 6 android:orientation="vertical" > 7 8 <LinearLayout 9 android:id="@+id/lin_main" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:layout_weight="1" 13 android:orientation="vertical" /> 14 15 <FrameLayout 16 android:id="@+id/fragment_container" 17 android:layout_width="match_parent" 18 android:layout_height="wrap_content" 19 android:layout_weight="1" > 20 </FrameLayout> 21 22 </LinearLayout>
fragment_layout.xml
根View是LinearLayout,背景色为蓝色。有一个TextView,一个Button。
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:background="#0000FF" 6 android:orientation="vertical" > 7 8 <TextView 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:text="@string/txt_fragment" /> 12 13 <Button 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:text="@string/btn_fragment" /> 17 18 </LinearLayout>
执行结果:
可以看到,我自定义的MyFragment添加到了Activity布局中的FrameLayout里(蓝色部分)。因为FrameLayout本来应该是红色的,但Fragment添加进去后,背景色与Fragment一致(即蓝色)。
代码:http://yunpan.cn/QnLn2LzKA8aEd (访问密码:bd8c)