首页 > 代码库 > android中用Fragment的简单介绍和创建选项卡详细列子
android中用Fragment的简单介绍和创建选项卡详细列子
Fragment要点
- Fragment作为Activity界面的一部分组成出现
- 可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用。
- 在Activity运行过程中,可以添加、移除或者替换Fragment(add()、remove()、replace())
- 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
通常, 应当至少实现如下的生命周期方法:
- 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的简单介绍和创建选项卡详细列子