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

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

在使用之前如果还没用过 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 回帖
  • fragment
    4 引用 • 1 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    10 引用 • 15 回帖 • 6 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 1 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 652 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    115 引用 • 318 回帖
  • Chrome

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

    63 引用 • 289 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 2 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 9 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 643 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 567 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 107 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 5 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 74 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 677 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • flomo

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

    6 引用 • 143 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 3 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 279 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 344 关注
  • OkHttp

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

    16 引用 • 6 回帖 • 93 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 464 关注
  • HHKB

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

    5 引用 • 74 回帖 • 521 关注