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)初始化基本信息
ft.commit();// 一定需要提交此事务}
<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
监听按钮单击事件
<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
- Android利用Fragment实现Tab布局
- 纯fragment布局实现tab
- fragment实现android tab
- 利用Fragment实现Tab页
- 利用Fragment实现Tab选项效果总结
- 【Android】ViewPager实现Tab布局
- android的Tab实现布局
- Android利用ViewPager实现Tab
- Android UI之Tab(ActionBar+Fragment实现)
- android:使用fragment实现tab切换
- android fragment 实现tab效果 注意事项
- Android Tab实现之FragmentManager+Fragment
- 利用Fragment实现应用的主布局
- Fragment与自定义布局实现类似tab的效果
- Fragment与自定义布局实现类似tab的效果
- ActionBar详解(五)--->利用ActionBar结合Fragment实现Tab导航
- 利用TabLayout+ViewPager+Fragment实现可滚动的Tab页面
- 多种多样的App主界面Tab实现方法——单独利用Fragment实现Tab
- The mook jong (HDU 5366)
- android基础之四——广播与服务(二)
- WebSocket 实战
- URL之好资源整理(看云平台)
- android基础之五——内容提供者
- Android利用Fragment实现Tab布局
- iscsi 挂载网络存储及存储访问
- Android Studio中导入Vitamio框架
- android基础之六——多媒体编程
- Android 5.0/5.1 HOOK技术探究
- 深入理解JVM
- hdoj 2080 夹角有多大II
- am335x嵌入式开发-bootloader启动流程
- Microsoft(R) Developer Studio 已停止工作 解决办法(1)