Android 开发之实用 FragmentLayout+fragment 实现新浪微博的四个主页面

本贴最后更新于 2456 天前,其中的信息可能已经时过境迁

在使用之前如果还没用过 fragment 的同学可以先了解下 fragment 的相关知识

1、Fragment:

Fragment 可以做为 Activity 的一个界面的一个组成部分,Activity 的界面可以完全由不同的 Fragment 组成,注意的是 Fragment 拥有自己的生命周期和接收、处理用户的事件,这样就不必在 Activity 写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个 Fragment。当然,你可以把 fragment 当成普通的控件一样放在 activity 的 xml 布局文件中。

Fragment 必须是依存与 Activity 而存在的,因此 Activity 的生命周期会直接影响到 Fragment 的生命周期。官网这张图很好的说明了两者生命周期的关系:

可以看到 Fragment 比 Activity 多了几个额外的生命周期回调方法:
onAttach(Activity)
当 Fragment 与 Activity 发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该 Fragment 的视图
onActivityCreated(Bundle)
当 Activity 的 onCreate 方法返回时调用
onDestoryView()
与 onCreateView 想对应,当该 Fragment 的视图被移除时调用
onDetach()
与 onAttach 相对应,当 Fragment 与 Activity 关联被取消时调用

注意:除了 onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现,

参考自:http://blog.csdn.net/lmj623565791/article/details/37970961/

Android之Fragment优点 - 沙翁 - 博客园

FragmentManager:你可以把 FragmentManager 想象成管理一系列的 fragment 的隐藏展示的一个类

接下来我们就来实现四个页面

最终效果:

第一步:布局 MainActivity 的布局文件

首先,我们在 main_activity.xml 中使用 fragmentlayout 来动态的装载我们要动态切换的四个 fragment

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="guanaj.com.weibo.MainActivity"> <FrameLayout android:id="@+id/root_fragment_layout" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="match_parent" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#cccccc" /> <RadioGroup android:id="@+id/radiogroup" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingBottom="10dp" android:paddingTop="10dp"> <RadioButton android:id="@+id/radiobutton_home" style="@style/main_radiobutton_stype" android:checked="true" android:drawableTop="@drawable/rb_select_home" android:text="主页" /> <RadioButton android:id="@+id/radiobutton_message" style="@style/main_radiobutton_stype" android:drawableTop="@drawable/rb_select_message" android:text="消息" /> <RadioButton android:id="@+id/radiobutton_post" style="@style/main_radiobutton_stype" android:text="发布" /> <RadioButton android:id="@+id/radiobutton_discover" style="@style/main_radiobutton_stype" android:drawableTop="@drawable/rb_select_discover" android:text="发现" /> <RadioButton android:id="@+id/radiobutton_profile" style="@style/main_radiobutton_stype" android:drawableTop="@drawable/rb_select_profile" android:text="我" /> </RadioGroup> </LinearLayout>

可以看到,底部我就先用 RadioGroup+RadioButton 实现,中间用一个 View 来实现一个灰色的分割线

底部按钮的样式为了统一管理,我们可以把他公共的样式抽取出来放到 res/values/styles.xml 文件中

<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="main_radiobutton_stype"> <item name="android:gravity">center</item> <item name="android:button">@null</item> <item name="android:layout_width">match_parent</item> <item name="android:layout_weight">1</item> <item name="android:layout_height">wrap_content</item> </style> </resources>

底部按钮的选中和不选中状态我们可以是用 select 选择器来实现,代码分别如下

rb_select_home.xml

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/tabbar_home_selected" android:state_checked="true"/> <item android:drawable="@drawable/tabbar_home" android:state_checked="false"/> </selector>

state_checked='true'表示被选中时显示的图片,其余三个类似

好的,布局文件准备好了,接下来我们要来准备四个 fragment

第二步:实现四个 Fragment

1、HomeFragment.java

package guanaj.com.weibo.pager; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import guanaj.com.weibo.R; /** * Created by guanaj on 2017/2/14. */ public class HomeFragment extends Fragment { public Activity mActivity; public LayoutInflater mInflater; @Override public void onAttach(Context context) { super.onAttach(context); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //activity创建时回掉,在这里获去依赖的activity对象 mActivity = getActivity(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mInflater = inflater;//用来将xml文件实例化成View的类实例 //在HomeFragment的xml文件渲染成view。 View rootView = mInflater.inflate(R.layout.fragment_home,null); //返回的View即为fragment要显示的View return rootView; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //fragment依赖的activity创建完成时回掉,一般在这里做fragment页面数据的初始化 } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } @Override public void onStop() { super.onStop(); } @Override public void onDestroyView() { super.onDestroyView(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onDetach() { super.onDetach(); } }

2、HomeFragment 的布局文件为

R.layout.fragment_home

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> /** * Created by guanaj on . */ <TextView android:text="主页" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

2、MessageFragment.java

package guanaj.com.weibo.pager; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import guanaj.com.weibo.R; /** * Created by guanaj on 2017/2/14. */ public class MessageFragment extends Fragment { public Activity mActivity; public LayoutInflater mInflater; @Override public void onAttach(Context context) { super.onAttach(context); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //activity创建时回掉,在这里获去依赖的activity对象 mActivity = getActivity(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mInflater = inflater;//用来将xml文件实例化成View的类实例 //在HomeFragment的xml文件渲染成view。 View rootView = mInflater.inflate(R.layout.fragment_message,null); //返回的View即为fragment要显示的View return rootView; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //fragment依赖的activity创建完成时回掉,一般在这里做fragment页面数据的初始化 } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } @Override public void onStop() { super.onStop(); } @Override public void onDestroyView() { super.onDestroyView(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onDetach() { super.onDetach(); } }

2、MessageFragment 的布局文件

R.layout.fragment_message

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> /** * Created by guanaj on . */ <TextView android:text="消息" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

其余两个类似

第三步:在 MainActivity 中动态的根据底部按钮的选中状态切换要显示的 fragment

MainActivity.java 的代码为:

package guanaj.com.weibo; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.FrameLayout; import android.widget.RadioGroup; import java.util.ArrayList; import guanaj.com.weibo.pager.DiscoverFragment; import guanaj.com.weibo.pager.HomeFragment; import guanaj.com.weibo.pager.MessageFragment; import guanaj.com.weibo.pager.ProfileFragment; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private ArrayList<Fragment> fragmentList = new ArrayList<>(); private RadioGroup radioGroup; private FragmentManager fragmentManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); initEvent(); initData(); } private void initViews() { //1、获取main_activity中的控件的实例化对象 radioGroup = (RadioGroup) findViewById(R.id.radiogroup); //2、获取FragmentManager /*注意倒入的fragmentManager,如果你的fragment是android.support.v4.app包中的, 你倒入的fragmentManager也要试v4v 包的, 我这里的fragment是import android.app.Fragment; 所以我导入的fragmentManager也是android.app包下面的 * */ /*如果是v4包的要用this.getSupportFragmentManager();*/ fragmentManager = this.getFragmentManager(); } private void initEvent() { radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.radiobutton_home: { setCurrentFragment(0); break; } case R.id.radiobutton_message: { setCurrentFragment(1); break; } case R.id.radiobutton_discover: { setCurrentFragment(2); break; } case R.id.radiobutton_profile: { setCurrentFragment(3); break; } case R.id.radiobutton_post:{ break; } default: { } } // } }); } private void initData() { /*3、数据的准备*/ HomeFragment homeFragment = new HomeFragment(); fragmentList.add(homeFragment); MessageFragment messageFragment = new MessageFragment(); fragmentList.add(messageFragment); DiscoverFragment discoverFragment = new DiscoverFragment(); fragmentList.add(discoverFragment); ProfileFragment profileFragment = new ProfileFragment(); fragmentList.add(profileFragment); //默认显示第1个也就是fragmentList.get(0) setCurrentFragment(0); } /** * 显示fragment * @param index */ private void setCurrentFragment(int index){ //3 通过fragmentmanager获取fragment的事务管理对象 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //4获取要显示的fragment Fragment fragment = fragmentList.get(index); //5、将要显示的fragment放入FragmentLayout中 fragmentTransaction.replace(R.id.root_fragment_layout, fragment); //6、提交事务,确定显示 fragmentTransaction.commit(); } }
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    337 引用 • 324 回帖 • 2 关注
  • fragment
    4 引用 • 1 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 370 关注
  • OneNote
    1 引用 • 3 回帖 • 2 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 390 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 93 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    593 引用 • 3533 回帖 • 2 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1795 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 5 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 3 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 641 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26724 引用 • 111325 回帖 • 1 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 37 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 368 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 44 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 202 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖 • 10 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 355 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 523 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    187 引用 • 1021 回帖 • 1 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 100 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1284 回帖