Android利用Fragment实现Tab布局

来源:互联网 发布:php 检验日期格式 编辑:程序博客网 时间:2024/05/16 08:40

Android利用Fragment实现Tab布局

在上一篇中,我们通过ViewPager实现了Tab布局, 这已经可以使用在项目的正常发布中,  但大多数人喜欢采用Fragment的方式进行实现。
笔者在此处建议, 希望两种方式都能掌握并灵活应用。
ps: 因为Fragment较为重要,所以本篇博客会进行基本的Fragment讲解

Fragment与Tab布局,面世的观念都是一样的,都是希望在窄小的屏幕上进行多功能的操作,提高用户的体验性。而Fragment的面世则将其Tab的实现给具体了。
Fragment的用法与Activity类似,事实上你可以将Fragment简单的理解为就是Activity,因为Fragment也具备者与Activity相同的生命周期,只不过Fragment的生命周期是建立在Activity的生命周期之上。 

关于Fragment与Activity的生命周期关联的角度看,其实可以非常理解Android为什么要这么做,Activity做为UI的老大, 任何关于UI方面都应该要遵循Activity的生命周期。


下图介绍Activity与Fragment的生命周期关联:


这关系图充分体现了Fragment与Activity的生命关联形式, 想要操作Fragment的生命周期方法的前提是Activity的状态为create。

大致了解之后, 以下开始讲解如何使用Fragment进行Tab布局(在Fragment中, 分为静态使用和动态使用,。
ps: 笔者这里只进行动态Fragment的Tab布局实现, 若是采用静态的方法实现Tab布局,那么我还是建议你使用ViewPager...


下图为最终效果图:




(可以看出,使用Fragment与ViewPager的实现效果一样,需注意布局效果可自定义, 此处只讲解实现的逻辑步骤



逻辑步骤:

1、创建两个Fragment,分别代表btn1和btn2单击后的布局。
2、创建两个Fragment对应的布局文件(这两步骤就当做Activity使用即可)
3、主布局文件中,使用FragmentLayout组件进行页面的占位
4、主Activity中,监听其按钮单击,分别调用Fragment在FragmentLayout中显示即可



1)下图为整个项目工程结构




2)定义Fragment类

public class FragmentOne extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_one, container, false);}}
返回的View类型代表将会在界面中显示的视图文件,这里引用到了fragment_one.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="match_parent"    android:gravity="center"    android:orientation="vertical" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:gravity="center_horizontal"        android:text="fragment one"        android:textSize="20pt" /></LinearLayout>

至此,第一个Fragment已经定义完成,  第二个Fragment与第一个定义的代码一样,就不贴出代码,看效果图即可;

3)定义主界面布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <FrameLayout        android:id="@+id/id_fragment"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1" />    <LinearLayout        android:id="@+id/id_layout"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <Button            android:id="@+id/id_btn1"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:onClick="btnStartClick"            android:text="btn1" />        <Button            android:id="@+id/id_btn2"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:onClick="btnStartClick"            android:text="btn2" />    </LinearLayout></LinearLayout>

此处布局文件中具有一个FragmentLayout组件,你可以理解为FragmentLayout就是一个Fragment显示的占位组件。

4)MainActivity.java类

4.1)自定义属性
private FragmentManager fm;private FragmentTransaction ft;private List<Fragment> fragments;

FragmentManager 对Fragment操作的整体管理类,主要用于创建FragmentTransaction对象。
FragmentTransaction对Fragment操作的类, 还记得在MainActivity的xml文件中定义的FragmentLayout组件吗。 此类对象可对他进行操作。

   以下介绍FragmentTransaction操作的核心方法:

add(): 向Activity中添加一个Fragment

remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
show()

显示之前隐藏的Fragment
detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()
重建view视图,附加到UI上并显示。
commit()//提交一个事务


4.2)初始化基本信息
<span style="white-space:pre"></span>/** * 初始化 */private void init() {if (fragments == null) {fragments = new ArrayList<Fragment>();}fragments.add(new FragmentOne());fragments.add(new FragmentTwo());


// 以上步骤都为初始化一个List<Fragment> 数据fm = getFragmentManager();    // 在Activity中可直接获取到Fragment的管理类ft = fm.beginTransaction();   // 注意:任何FragmentLayout操作Fragment的类都需要在一个事务中进行(相信如果有数据库基础的同学应该很好理解。ft.replace(R.id.id_fragment, fragments.get(0)); // 替换方法,代表将FragmentLayout组件使用一个Fragment类进行替换掉(注意第一个参数就是FagmentLayout


ft.commit();// 一定需要提交此事务}

  监听按钮单击事件

<span style="white-space:pre"></span>public void btnStartClick(View v) {switch (v.getId()) {case R.id.id_btn1:ft = fm.beginTransaction();ft.replace(R.id.id_fragment, fragments.get(0));ft.commit();break;case R.id.id_btn2:ft = fm.beginTransaction();ft.replace(R.id.id_fragment, fragments.get(1));ft.commit();break;}}

现在,所有的代码已经显示完毕。 这可能比使用ViewPager实现具有一定的难度(考虑到了原子性),但Fragment是必不可少的一个组件知识点,学习者们务必掌握!

ps: 小细节,如果该FragmentLayout组件你是采用add方式进去,则若是想要显示第二张Fragment的时候,需要先调用hide()方法将其隐藏掉,否则会出现叠加的效果!








0 0
原创粉丝点击