首页 > 代码库 > android中用Fragment的简单介绍和创建选项卡详细列子

android中用Fragment的简单介绍和创建选项卡详细列子

 

Fragment要点

  1. Fragment作为Activity界面的一部分组成出现
  2. 可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用。
  3. 在Activity运行过程中,可以添加、移除或者替换Fragment(add()、remove()、replace())
  4. Fragment可以响应自己的输入事件,并且有自己的生命周期,当然,它们的生命周期直接被其所属的宿主activity的生命周期影响。
 

设计哲学        

        Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计。平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互。Fragment允许这样的一种设计,而不需要你亲自来管理 viewhierarchy的复杂变化。 通过将activity的布局分散到fragment中, 你可以在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化.(http://developer.android.com/guide/topics/fundamentals/fragments.html)  

 

         例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章--2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输入事件。 因此, 取代使用一个activity来选择一篇文章而另一个activity来阅读文章的方式,用户可以在同一个activity中选择一篇文章并且阅读, 如图所示:

     fragment在你的应用中应当是一个模块化和可重用的组件.即,因为fragment定义了它自己的布局, 以及通过使用它自己的生命周期回调方法定义了它自己的行为,你可以将fragment包含到多个activity中. 这点特别重要, 因为这允许你将你的用户体验适配到不同的屏幕尺寸.举个例子,你可能会仅当在屏幕尺寸足够大时,在一个activity中包含多个fragment,并且,当不属于这种情况时,会启动另一个单独的,使用不同fragment的activity.

     继续之前那个新闻的例子 -- 当运行在一个特别大的屏幕时(例如平板电脑),应用可以在Activity A中嵌入2个fragment。然而,在一个正常尺寸的屏幕(例如手机)上,没有足够的空间同时供2个fragment用, 因此, Activity A会仅包含文章列表的fragment, 而当用户选择一篇文章时, 它会启动ActivityB,它包含阅读文章的fragment.因此, 应用可以同时支持上图中的2种设计模式。

创建Fragment

       要创建一个fragment, 必须创建一个 Fragment 的子类 (或者继承自一个已存在的它的子类). Fragment类的代码看起来很像 Activity 。它包含了和activity类似的回调方法, 例如onCreate()、 onStart()、onPause()以及 onStop()。事实上, 如果你准备将一个现成的Android应用转换到使用fragment,可能只需简单的将代码从你的activity的回调方法分别移动到你的fragment的回调方法即可。
    

      通常, 应当至少实现如下的生命周期方法:

  • onCreate()
    当创建fragment时, 系统调用该方法. 
    在实现代码中,应当初始化想要在fragment中保持的必要组件, 当fragment被暂停或者停止后可以恢复.
  • onCreateView()
    fragment第一次绘制它的用户界面的时候, 系统会调用此方法. 为了绘制fragment的UI,此方法必须返回一个View, 这个view是你的fragment布局的根view. 如果fragment不提供UI, 可以返回null.
  • onPause()
    用户将要离开fragment时,系统调用这个方法作为第一个指示(然而它不总是意味着fragment将被销毁.) 在当前用户会话结束之前,通常应当在这里提交任何应该持久化的变化(因为用户有可能不会返回).
其生命周期图如下:

 大多数应用应当为每一个fragment实现至少这3个方法,但是还有一些其他回调方法你也应当用来去处理fragment生命周期的各种阶段.全部的生命周期回调方法将会在后面章节 Handlingthe Fragment Lifecycle 中讨论.

      除了继承基类 Fragment , 还有一些子类你可能会继承:

 

  • DialogFragment
    显示一个浮动的对话框.  
    用这个类来创建一个对话框,是使用在Activity类的对话框工具方法之外的一个好的选择,
    因为你可以将一个fragment对话框合并到activity管理的fragment back stack中,允许用户返回到一个之前曾被摒弃的fragment.
  • ListFragment
    显示一个由一个adapter(例如 SimpleCursorAdapter)管理的项目的列表, 类似于ListActivity.
    它提供一些方法来管理一个list view, 例如 onListItemClick()回调来处理点击事件.
  • PreferenceFragment
    显示一个 Preference对象的层次结构的列表, 类似于PreferenceActivity. 
    这在为你的应用创建一个"设置"activity时有用处.
    好了,下来都是官方的列子我就不多说了,直接上我的fragment创建选项卡详细列子:
    MainActivity
import com.menglifang.frag.FragmentOne;import com.menglifang.frag.FragmentTwo;import com.menglifang.frag.Fragmentfour;import com.menglifang.frag.Fragmentfree;import android.os.Bundle;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.view.View;import android.view.View.OnClickListener;import android.widget.FrameLayout;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends FragmentActivity implements OnClickListener{    FrameLayout frameLayout;     TextView text1,text2,text3,text4;    FragmentManager fm;     private FragmentTransaction ft;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        frameLayout=(FrameLayout ) findViewById(R.id.frag_view);        text1=(TextView) findViewById(R.id.tab_one);        text2=(TextView) findViewById(R.id.tab_two);        text3=(TextView) findViewById(R.id.tab_free);        text4=(TextView) findViewById(R.id.tab_four);                text1.setOnClickListener(this);        text2.setOnClickListener(this);        text3.setOnClickListener(this);        text4.setOnClickListener(this);        fm=this.getSupportFragmentManager();        ft=fm.beginTransaction();        ft.replace(R.id.frag_view, new FragmentOne());        ft.commit();            }    @Override    public void onClick(View arg0) {        ft=fm.beginTransaction();        switch(arg0.getId()){        case R.id.tab_one:            ft.replace(R.id.frag_view, new FragmentOne());            break;        case R.id.tab_two:            ft.replace(R.id.frag_view, new FragmentTwo());            break;        case R.id.tab_free:            ft.replace(R.id.frag_view, new Fragmentfree());            break;        case R.id.tab_four:            ft.replace(R.id.frag_view, new Fragmentfour());            break;                    }        ft.commit();    }    }

创建了四个Fragement:为了简单我的四个fragment中每个Fragement否是一样的就是各自的布局文件不同

import com.menglifang.fragment.R;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class FragmentOne extends Fragment{    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        // TODO Auto-generated method stub        View view=inflater.inflate(R.layout.fragone, null);        return view;//super.onCreateView(inflater, container, savedInstanceState);    }}

布局文件:在此只给出MainActivity中的布局和一个fragment中的布局

MainActivity中的布局:activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity" ><LinearLayout    android:id="@+id/tab"     android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal">    <TextView         android:id="@+id/tab_one"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="最新新闻"/>    <TextView android:id="@+id/tab_two"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="热点新闻"/>    <TextView         android:id="@+id/tab_free"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="社会新闻"/>    <TextView         android:id="@+id/tab_four"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="利物浦新闻"/></LinearLayout>   <FrameLayout        android:orientation="vertical"       android:id="@+id/frag_view"       android:layout_below="@+id/tab"       android:layout_width="fill_parent"       android:layout_height="fill_parent"       android:background="#ffff00"></FrameLayout></RelativeLayout>

一个fragment的布局:fragone.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="200dp"    android:orientation="vertical" >    <TextView         android:background="#ff0000"        android:gravity="center"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="这是第一个frage"/></LinearLayout>

 

 

其实这个列子好简单,一看基本就明白了,我在网上查了,好多人都是拿官网的列子复制下来,我觉得实实在在的列子比较容易让人理解

多有不足欢迎大家学习交流

android中用Fragment的简单介绍和创建选项卡详细列子