本篇博客力求为大家说明Fragment如何产生,什么是Fragment,Fragment生命周期,如何静态和动态的使用Fragment,Fragment回退栈,Fragment事务;以及Fragment的一些特殊用途,例如:没有布局的Fragment有何用处?Fragment如何与Activity交互?Fragment如何创建对话框?Fragment如何与ActionBar集成等等。
## ## ## <a></a><span>1、Fragment的产生与介绍</span>
<span></span>Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。
## ## ## <a></a><span>2、Fragment的生命周期</span>
<span></span>Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:
![](http://img.blog.csdn.net/20140719225005356?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1qNjIzNTY1Nzkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看到Fragment比Activity多了几个额外的生命周期回调方法:
**onAttach(Activity)**
<span></span><span></span>当Fragment与Activity发生关联时调用。
**onCreateView(LayoutInflater, ViewGroup,Bundle)**
<span></span><span></span>创建该Fragment的视图
**onActivityCreated(Bundle)**
<span></span><span></span>当Activity的onCreate方法返回时调用
**onDestoryView()**
<span></span><span></span>与onCreateView想对应,当该Fragment的视图被移除时调用
**onDetach()**
<span></span><span></span>与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现,
## ## ## <a></a><span>3、静态的使用Fragment</span>
嘿嘿,终于到使用的时刻了~~
这是使用Fragment最简单的一种方式,把Fragment当成普通的控件,直接写在Activity的布局文件中。步骤:
**1、继承Fragment,重写onCreateView决定Fragemnt的布局**
**2、在Activity中声明此Fragment,就当和普通的View一样**
下面展示一个例子(我使用2个Fragment作为Activity的布局,一个Fragment用于标题布局,一个Fragment用于内容布局):
TitleFragment的布局文件:
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools">**[html]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span class="tag"><?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">“1.0”</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">“utf-8”</span><span class="tag">?></span><span> </span></span>
2. <span><span class="tag"><</span><span class="tag-name">RelativeLayout</span><span> </span><span class="attribute">xmlns:android</span><span>=</span><span class="attribute-value">“http://schemas.android.com/apk/res/android”</span><span> </span></span>
3. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“match_parent”</span><span> </span></span>
4. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“45dp”</span><span> </span></span>
5. <span> <span class="attribute">android:background</span><span>=</span><span class="attribute-value">“@drawable/title_bar”</span><span> </span><span class="tag">></span><span> </span></span>
6. <span> </span>
7. <span> <span class="tag"><</span><span class="tag-name">ImageButton</span><span> </span></span>
8. <span> <span class="attribute">android:id</span><span>=</span><span class="attribute-value">“@+id/id_title_left_btn”</span><span> </span></span>
9. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“wrap_content”</span><span> </span></span>
10. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“wrap_content”</span><span> </span></span>
11. <span> <span class="attribute">android:layout_centerVertical</span><span>=</span><span class="attribute-value">“true”</span><span> </span></span>
12. <span> <span class="attribute">android:layout_marginLeft</span><span>=</span><span class="attribute-value">“3dp”</span><span> </span></span>
13. <span> <span class="attribute">android:background</span><span>=</span><span class="attribute-value">“@drawable/showleft_selector”</span><span> </span><span class="tag">/></span><span> </span></span>
14. <span> </span>
15. <span> <span class="tag"><</span><span class="tag-name">TextView</span><span> </span></span>
16. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“fill_parent”</span><span> </span></span>
17. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“fill_parent”</span><span> </span></span>
18. <span> <span class="attribute">android:gravity</span><span>=</span><span class="attribute-value">“center”</span><span> </span></span>
19. <span> <span class="attribute">android:text</span><span>=</span><span class="attribute-value">“我不是微信”</span><span> </span></span>
20. <span> <span class="attribute">android:textColor</span><span>=</span><span class="attribute-value">“# fff”</span><span> </span></span>
21. <span> <span class="attribute">android:textSize</span><span>=</span><span class="attribute-value">“20sp”</span><span> </span></span>
22. <span> <span class="attribute">android:textStyle</span><span>=</span><span class="attribute-value">“bold”</span><span> </span><span class="tag">/></span><span> </span></span>
23. <span> </span>
24. <span><span class="tag"></</span><span class="tag-name">RelativeLayout</span><span class="tag">></span><span> </span></span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="html"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@drawable/title_bar" >
<ImageButton
android:id="@+id/id_title_left_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="3dp"
android:background="@drawable/showleft_selector" />
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:text="我不是微信"
android:textColor="# fff"
android:textSize="20sp"
android:textStyle="bold" />
</RelativeLayout></pre>
TitleFragment<div class="dp-highlighter bg_java"><div class="bar"><div class="tools">**[java]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span class="keyword">package</span><span> com.zhy.zhy_fragments; </span></span>
2. <span> </span>
3. <span><span class="keyword">import</span><span> android.app.Fragment; </span></span>
4. <span><span class="keyword">import</span><span> android.os.Bundle; </span></span>
5. <span><span class="keyword">import</span><span> android.view.LayoutInflater; </span></span>
6. <span><span class="keyword">import</span><span> android.view.View; </span></span>
7. <span><span class="keyword">import</span><span> android.view.View.OnClickListener; </span></span>
8. <span><span class="keyword">import</span><span> android.view.ViewGroup; </span></span>
9. <span><span class="keyword">import</span><span> android.widget.ImageButton; </span></span>
10. <span><span class="keyword">import</span><span> android.widget.Toast; </span></span>
11. <span> </span>
12. <span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> TitleFragment </span><span class="keyword">extends</span><span> Fragment </span></span>
13. <span>{ </span>
14. <span> </span>
15. <span> <span class="keyword">private</span><span> ImageButton mLeftMenu; </span></span>
16. <span> </span>
17. <span> <span class="annotation">@Override</span><span> </span></span>
18. <span> <span class="keyword">public</span><span> View onCreateView(LayoutInflater inflater, ViewGroup container, </span></span>
19. <span> Bundle savedInstanceState) </span>
20. <span> { </span>
21. <span> View view = inflater.inflate(R.layout.fragment_title, container, <span class="keyword">false</span><span>); </span></span>
22. <span> mLeftMenu = (ImageButton) view.findViewById(R.id.id_title_left_btn); </span>
23. <span> mLeftMenu.setOnClickListener(<span class="keyword">new</span><span> OnClickListener() </span></span>
24. <span> { </span>
25. <span> <span class="annotation">@Override</span><span> </span></span>
26. <span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onClick(View v) </span></span>
27. <span> { </span>
28. <span> Toast.makeText(getActivity(), </span>
29. <span> <span class="string">”i am an ImageButton in TitleFragment ! ”</span><span>, </span></span>
30. <span> Toast.LENGTH_SHORT).show(); </span>
31. <span> } </span>
32. <span> }); </span>
33. <span> <span class="keyword">return</span><span> view; </span></span>
34. <span> } </span>
35. <span>} </span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="java">package com.zhy.zhy_fragments;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.Toast;
public class TitleFragment extends Fragment
{
private ImageButton mLeftMenu;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_title, container, false);
mLeftMenu = (ImageButton) view.findViewById(R.id.id_title_left_btn);
mLeftMenu.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Toast.makeText(getActivity(),
"i am an ImageButton in TitleFragment ! ",
Toast.LENGTH_SHORT).show();
}
});
return view;
}
}
</pre>
同理还有ContentFragment的其布局文件:<div class="dp-highlighter bg_html"><div class="bar"><div class="tools">**[html]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span class="tag"><?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">“1.0”</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">“utf-8”</span><span class="tag">?></span><span> </span></span>
2. <span><span class="tag"><</span><span class="tag-name">LinearLayout</span><span> </span><span class="attribute">xmlns:android</span><span>=</span><span class="attribute-value">“http://schemas.android.com/apk/res/android”</span><span> </span></span>
3. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“match_parent”</span><span> </span></span>
4. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“match_parent”</span><span> </span></span>
5. <span> <span class="attribute">android:orientation</span><span>=</span><span class="attribute-value">“vertical”</span><span> </span><span class="tag">></span><span> </span></span>
6. <span> </span>
7. <span> <span class="tag"><</span><span class="tag-name">TextView</span><span> </span></span>
8. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“fill_parent”</span><span> </span></span>
9. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“fill_parent”</span><span> </span></span>
10. <span> <span class="attribute">android:gravity</span><span>=</span><span class="attribute-value">“center”</span><span> </span></span>
11. <span> <span class="attribute">android:text</span><span>=</span><span class="attribute-value">“使用Fragment做主面板”</span><span> </span></span>
12. <span> <span class="attribute">android:textSize</span><span>=</span><span class="attribute-value">“20sp”</span><span> </span></span>
13. <span> <span class="attribute">android:textStyle</span><span>=</span><span class="attribute-value">“bold”</span><span> </span><span class="tag">/></span><span> </span></span>
14. <span> </span>
15. <span><span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span><span> </span></span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="html"><?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="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:text="使用Fragment做主面板"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout></pre>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools">**[java]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span class="keyword">package</span><span> com.zhy.zhy_fragments; </span></span>
2. <span> </span>
3. <span><span class="keyword">import</span><span> android.app.Fragment; </span></span>
4. <span><span class="keyword">import</span><span> android.os.Bundle; </span></span>
5. <span><span class="keyword">import</span><span> android.view.LayoutInflater; </span></span>
6. <span><span class="keyword">import</span><span> android.view.View; </span></span>
7. <span><span class="keyword">import</span><span> android.view.ViewGroup; </span></span>
8. <span> </span>
9. <span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> ContentFragment </span><span class="keyword">extends</span><span> Fragment </span></span>
10. <span>{ </span>
11. <span> </span>
12. <span> <span class="annotation">@Override</span><span> </span></span>
13. <span> <span class="keyword">public</span><span> View onCreateView(LayoutInflater inflater, ViewGroup container, </span></span>
14. <span> Bundle savedInstanceState) </span>
15. <span> { </span>
16. <span> <span class="keyword">return</span><span> inflater.inflate(R.layout.fragment_content, container, </span><span class="keyword">false</span><span>); </span></span>
17. <span> } </span>
18. <span> </span>
19. <span>} </span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="java">package com.zhy.zhy_fragments;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class ContentFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_content, container, false);
}
}
</pre>
MainActivity<div class="dp-highlighter bg_java"><div class="bar"><div class="tools">**[java]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span class="keyword">package</span><span> com.zhy.zhy_fragments; </span></span>
2. <span> </span>
3. <span><span class="keyword">import</span><span> android.app.Activity; </span></span>
4. <span><span class="keyword">import</span><span> android.os.Bundle; </span></span>
5. <span><span class="keyword">import</span><span> android.view.Window; </span></span>
6. <span> </span>
7. <span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MainActivity </span><span class="keyword">extends</span><span> Activity </span></span>
8. <span>{ </span>
9. <span> </span>
10. <span> <span class="annotation">@Override</span><span> </span></span>
11. <span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> onCreate(Bundle savedInstanceState) </span></span>
12. <span> { </span>
13. <span> <span class="keyword">super</span><span>.onCreate(savedInstanceState); </span></span>
14. <span> requestWindowFeature(Window.FEATURE_NO_TITLE); </span>
15. <span> setContentView(R.layout.activity_main); </span>
16. <span> } </span>
17. <span> </span>
18. <span>} </span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="java">package com.zhy.zhy_fragments;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
}
}
</pre>
Activity的布局文件:<div class="dp-highlighter bg_java"><div class="bar"><div class="tools">**[java]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span><RelativeLayout xmlns:android=</span><span class="string">“http://schemas.android.com/apk/res/android”</span><span> </span></span>
2. <span> xmlns:tools=<span class="string">”http://schemas.android.com/tools”</span><span> </span></span>
3. <span> android:layout_width=<span class="string">”match_parent”</span><span> </span></span>
4. <span> android:layout_height=<span class="string">”match_parent”</span><span> > </span></span>
5. <span> </span>
6. <span> <fragment </span>
7. <span> android:id=<span class="string">”@+id/id_fragment_title”</span><span> </span></span>
8. <span> android:name=<span class="string">”com.zhy.zhy_fragments.TitleFragment”</span><span> </span></span>
9. <span> android:layout_width=<span class="string">”fill_parent”</span><span> </span></span>
10. <span> android:layout_height=<span class="string">”45dp”</span><span> /> </span></span>
11. <span> </span>
12. <span> <fragment </span>
13. <span> android:layout_below=<span class="string">”@id/id_fragment_title”</span><span> </span></span>
14. <span> android:id=<span class="string">”@+id/id_fragment_content”</span><span> </span></span>
15. <span> android:name=<span class="string">”com.zhy.zhy_fragments.ContentFragment”</span><span> </span></span>
16. <span> android:layout_width=<span class="string">”fill_parent”</span><span> </span></span>
17. <span> android:layout_height=<span class="string">”fill_parent”</span><span> /> </span></span>
18. <span> </span>
19. <span></RelativeLayout> </span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="java"><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" >
<fragment
android:id="@+id/id_fragment_title"
android:name="com.zhy.zhy_fragments.TitleFragment"
android:layout_width="fill_parent"
android:layout_height="45dp" />
<fragment
android:layout_below="@id/id_fragment_title"
android:id="@+id/id_fragment_content"
android:name="com.zhy.zhy_fragments.ContentFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout></pre>
是不是把Fragment当成普通的View一样声明在Activity的布局文件中,然后所有控件的事件处理等代码都由各自的Fragment去处理,瞬间觉得Activity好干净有木有~~代码的可读性、复用性以及可维护性是不是瞬间提升了~~~下面看下效果图:
![](http://img.blog.csdn.net/20140719230904593)
## ## ## <a></a><span>4、动态的使用Fragment</span>
上面已经演示了,最简单的使用Fragment的方式~下面介绍如何动态的添加、更新、以及删除Fragment
为了动态使用Fragment,我们修改一下Actvity的布局文件,中间使用一个FrameLayout,下面添加四个按钮~~~嘿嘿~~不是微信的按钮- -!
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools">**[html]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span class="tag"><</span><span class="tag-name">RelativeLayout</span><span> </span><span class="attribute">xmlns:android</span><span>=</span><span class="attribute-value">“http://schemas.android.com/apk/res/android”</span><span> </span></span>
2. <span> <span class="attribute">xmlns:tools</span><span>=</span><span class="attribute-value">“http://schemas.android.com/tools”</span><span> </span></span>
3. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“match_parent”</span><span> </span></span>
4. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“match_parent”</span><span> </span><span class="tag">></span><span> </span></span>
5. <span> </span>
6. <span> <span class="tag"><</span><span class="tag-name">fragment</span><span> </span></span>
7. <span> <span class="attribute">android:id</span><span>=</span><span class="attribute-value">“@+id/id_fragment_title”</span><span> </span></span>
8. <span> <span class="attribute">android:name</span><span>=</span><span class="attribute-value">“com.zhy.zhy_fragments.TitleFragment”</span><span> </span></span>
9. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“fill_parent”</span><span> </span></span>
10. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“45dp”</span><span> </span><span class="tag">/></span><span> </span></span>
11. <span> </span>
12. <span> <span class="tag"><</span><span class="tag-name">include</span><span> </span></span>
13. <span> <span class="attribute">android:id</span><span>=</span><span class="attribute-value">“@+id/id_ly_bottombar”</span><span> </span></span>
14. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“fill_parent”</span><span> </span></span>
15. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“55dp”</span><span> </span></span>
16. <span> <span class="attribute">android:layout_alignParentBottom</span><span>=</span><span class="attribute-value">“true”</span><span> </span></span>
17. <span> <span class="attribute">layout</span><span>=</span><span class="attribute-value">“@layout/bottombar”</span><span> </span><span class="tag">/></span><span> </span></span>
18. <span> </span>
19. <span> <span class="tag"><</span><span class="tag-name">FrameLayout</span><span> </span></span>
20. <span> <span class="attribute">android:id</span><span>=</span><span class="attribute-value">“@+id/id_content”</span><span> </span></span>
21. <span> <span class="attribute">android:layout_width</span><span>=</span><span class="attribute-value">“fill_parent”</span><span> </span></span>
22. <span> <span class="attribute">android:layout_height</span><span>=</span><span class="attribute-value">“fill_parent”</span><span> </span></span>
23. <span> <span class="attribute">android:layout_above</span><span>=</span><span class="attribute-value">“@id/id_ly_bottombar”</span><span> </span></span>
24. <span> <span class="attribute">android:layout_below</span><span>=</span><span class="attribute-value">“@id/id_fragment_title”</span><span> </span><span class="tag">/></span><span> </span></span>
25. <span> </span>
26. <span><span class="tag"></</span><span class="tag-name">RelativeLayout</span><span class="tag">></span><span> </span></span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="html"><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" >
<fragment
android:id="@+id/id_fragment_title"
android:name="com.zhy.zhy_fragments.TitleFragment"
android:layout_width="fill_parent"
android:layout_height="45dp" />
<include
android:id="@+id/id_ly_bottombar"
android:layout_width="fill_parent"
android:layout_height="55dp"
android:layout_alignParentBottom="true"
layout="@layout/bottombar" />
<FrameLayout
android:id="@+id/id_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/id_ly_bottombar"
android:layout_below="@id/id_fragment_title" />
</RelativeLayout></pre>
底部四个按钮的布局就不贴了,到时看效果图就明白了~~
下面主Activity
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools">**[java]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span class="keyword">package</span><span> com.zhy.zhy_fragments; </span></span>
2. <span> </span>
3. <span><span class="keyword">import</span><span> android.app.Activity; </span></span>
4. <span><span class="keyword">import</span><span> android.app.FragmentManager; </span></span>
5. <span><span class="keyword">import</span><span> android.app.FragmentTransaction; </span></span>
6. <span><span class="keyword">import</span><span> android.os.Bundle; </span></span>
7. <span><span class="keyword">import</span><span> android.view.View; </span></span>
8. <span><span class="keyword">import</span><span> android.view.View.OnClickListener; </span></span>
9. <span><span class="keyword">import</span><span> android.view.Window; </span></span>
10. <span><span class="keyword">import</span><span> android.widget.LinearLayout; </span></span>
11. <span> </span>
12. <span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MainActivity </span><span class="keyword">extends</span><span> Activity </span><span class="keyword">implements</span><span> OnClickListener </span></span>
13. <span>{ </span>
14. <span> <span class="keyword">private</span><span> LinearLayout mTabWeixin; </span></span>
15. <span> <span class="keyword">private</span><span> LinearLayout mTabFriend; </span></span>
16. <span> </span>
17. <span> <span class="keyword">private</span><span> ContentFragment mWeixin; </span></span>
18. <span> <span class="keyword">private</span><span> FriendFragment mFriend; </span></span>
19. <span> </span>
20. <span> <span class="annotation">@Override</span><span> </span></span>
21. <span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> onCreate(Bundle savedInstanceState) </span></span>
22. <span> { </span>
23. <span> <span class="keyword">super</span><span>.onCreate(savedInstanceState); </span></span>
24. <span> requestWindowFeature(Window.FEATURE_NO_TITLE); </span>
25. <span> setContentView(R.layout.activity_main); </span>
26. <span> </span>
27. <span> <span class="comment">// 初始化控件和声明事件</span><span> </span></span>
28. <span> mTabWeixin = (LinearLayout) findViewById(R.id.tab_bottom_weixin); </span>
29. <span> mTabFriend = (LinearLayout) findViewById(R.id.tab_bottom_friend); </span>
30. <span> mTabWeixin.setOnClickListener(<span class="keyword">this</span><span>); </span></span>
31. <span> mTabFriend.setOnClickListener(<span class="keyword">this</span><span>); </span></span>
32. <span> </span>
33. <span> <span class="comment">// 设置默认的Fragment</span><span> </span></span>
34. <span> setDefaultFragment(); </span>
35. <span> } </span>
36. <span> </span>
37. <span> <span class="keyword">private</span><span> </span><span class="keyword">void</span><span> setDefaultFragment() </span></span>
38. <span> { </span>
39. <span> FragmentManager fm = getFragmentManager(); </span>
40. <span> FragmentTransaction transaction = fm.beginTransaction(); </span>
41. <span> mWeixin = <span class="keyword">new</span><span> ContentFragment(); </span></span>
42. <span> transaction.replace(R.id.id_content, mWeixin); </span>
43. <span> transaction.commit(); </span>
44. <span> } </span>
45. <span> </span>
46. <span> <span class="annotation">@Override</span><span> </span></span>
47. <span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onClick(View v) </span></span>
48. <span> { </span>
49. <span> FragmentManager fm = getFragmentManager(); </span>
50. <span> <span class="comment">// 开启Fragment事务</span><span> </span></span>
51. <span> FragmentTransaction transaction = fm.beginTransaction(); </span>
52. <span> </span>
53. <span> <span class="keyword">switch</span><span> (v.getId()) </span></span>
54. <span> { </span>
55. <span> <span class="keyword">case</span><span> R.id.tab_bottom_weixin: </span></span>
56. <span> <span class="keyword">if</span><span> (mWeixin == </span><span class="keyword">null</span><span>) </span></span>
57. <span> { </span>
58. <span> mWeixin = <span class="keyword">new</span><span> ContentFragment(); </span></span>
59. <span> } </span>
60. <span> <span class="comment">// 使用当前Fragment的布局替代id_content的控件</span><span> </span></span>
61. <span> transaction.replace(R.id.id_content, mWeixin); </span>
62. <span> <span class="keyword">break</span><span>; </span></span>
63. <span> <span class="keyword">case</span><span> R.id.tab_bottom_friend: </span></span>
64. <span> <span class="keyword">if</span><span> (mFriend == </span><span class="keyword">null</span><span>) </span></span>
65. <span> { </span>
66. <span> mFriend = <span class="keyword">new</span><span> FriendFragment(); </span></span>
67. <span> } </span>
68. <span> transaction.replace(R.id.id_content, mFriend); </span>
69. <span> <span class="keyword">break</span><span>; </span></span>
70. <span> } </span>
71. <span> <span class="comment">// transaction.addToBackStack();</span><span> </span></span>
72. <span> <span class="comment">// 事务提交</span><span> </span></span>
73. <span> transaction.commit(); </span>
74. <span> } </span>
75. <span> </span>
76. <span>} </span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="java">package com.zhy.zhy_fragments;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.LinearLayout;
public class MainActivity extends Activity implements OnClickListener
{
private LinearLayout mTabWeixin;
private LinearLayout mTabFriend;
private ContentFragment mWeixin;
private FriendFragment mFriend;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// 初始化控件和声明事件
mTabWeixin = (LinearLayout) findViewById(R.id.tab_bottom_weixin);
mTabFriend = (LinearLayout) findViewById(R.id.tab_bottom_friend);
mTabWeixin.setOnClickListener(this);
mTabFriend.setOnClickListener(this);
// 设置默认的Fragment
setDefaultFragment();
}
private void setDefaultFragment()
{
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
mWeixin = new ContentFragment();
transaction.replace(R.id.id_content, mWeixin);
transaction.commit();
}
@Override
public void onClick(View v)
{
FragmentManager fm = getFragmentManager();
// 开启Fragment事务
FragmentTransaction transaction = fm.beginTransaction();
switch (v.getId())
{
case R.id.tab_bottom_weixin:
if (mWeixin == null)
{
mWeixin = new ContentFragment();
}
// 使用当前Fragment的布局替代id_content的控件
transaction.replace(R.id.id_content, mWeixin);
break;
case R.id.tab_bottom_friend:
if (mFriend == null)
{
mFriend = new FriendFragment();
}
transaction.replace(R.id.id_content, mFriend);
break;
}
// transaction.addToBackStack();
// 事务提交
transaction.commit();
}
}
</pre>
可以看到我们使用FragmentManager对Fragment进行了动态的加载,这里使用的是replace方法~~下一节我会详细介绍FragmentManager的常用API。
注:如果使用Android3.0以下的版本,需要引入v4的包,然后Activity继承FragmentActivity,然后通过getSupportFragmentManager获得FragmentManager。不过还是建议版Menifest文件的uses-sdk的minSdkVersion和targetSdkVersion都改为11以上,这样就不必引入v4包了。
代码中间还有两个Fragment的子类,ContentFragment上面已经见过,FriendFragment其实类似:
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools">**[java]** [view plain](# "view plain")<span> [copy](# "copy")</span><div></div><span> [print](# "print")</span>[?](# "?")</div></div>
1. <span><span class="keyword">package</span><span> com.zhy.zhy_fragments; </span></span>
2. <span> </span>
3. <span><span class="keyword">import</span><span> android.app.Fragment; </span></span>
4. <span><span class="keyword">import</span><span> android.os.Bundle; </span></span>
5. <span><span class="keyword">import</span><span> android.view.LayoutInflater; </span></span>
6. <span><span class="keyword">import</span><span> android.view.View; </span></span>
7. <span><span class="keyword">import</span><span> android.view.ViewGroup; </span></span>
8. <span> </span>
9. <span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> FriendFragment </span><span class="keyword">extends</span><span> Fragment </span></span>
10. <span>{ </span>
11. <span> </span>
12. <span> <span class="annotation">@Override</span><span> </span></span>
13. <span> <span class="keyword">public</span><span> View onCreateView(LayoutInflater inflater, ViewGroup container, </span></span>
14. <span> Bundle savedInstanceState) </span>
15. <span> { </span>
16. <span> <span class="keyword">return</span><span> inflater.inflate(R.layout.fragment_friend, container, </span><span class="keyword">false</span><span>); </span></span>
17. <span> } </span>
18. <span> </span>
19. <span>} </span><div class="save_code tracking-ad"><a>![](http://static.blog.csdn.net/images/save_snippets.png)</a></div></div><pre class="java">package com.zhy.zhy_fragments;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FriendFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_friend, container, false);
}
}
</pre>
效果图:
![](http://img.blog.csdn.net/20140720002532641)
可以看到很好的实现了效果,其实这个效果以前的博客中也出现过,在博客:[Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager](http://blog.csdn.net/lmj623565791/article/details/24740977),有兴趣可以看看。ps:为了代码的简洁,就不添加按钮的点击变化什么的了,主要讲解功能了