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

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

在使用之前如果还没用过 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 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖 • 3 关注
  • fragment
    4 引用 • 1 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Kubernetes

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

    118 引用 • 54 回帖 • 6 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 543 回帖 • 1 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 36 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖 • 1 关注
  • JavaScript

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

    730 引用 • 1283 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 1 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 506 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 671 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 4 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 232 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 2 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 178 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 119 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1062 引用 • 3455 回帖 • 150 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 712 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖 • 1 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 7 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 242 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 2 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    61 引用 • 29 回帖 • 11 关注