如今Android上很多应用都采用底部菜单控制更新的UI这种框架,例如新浪微博

点击底部菜单的选项可以更新界面。底部菜单可以使用TabHost来实现,不过用过TabHost的人都知道自定义TabHost究竟是有多麻烦的,原生TabHost的风格是不依附屏幕的底部的,要依附底部就要重写布局。

TabHost设置的Container可以管理UI的显示,UI可以用LayoutInflater动态生成,也可以是Activity,但不好管理Activity的生命周期。然后用TabHost控制显示UI的显示。

下面使用的一种方法是自定义菜单布局+ActivityGroup+多个Activity的方式实现,下面是Demo的截图:

          

ActivityGroup

ActivityGroup,顾名思义就是Activity组,可以管理多个Activity的启动和销毁。ActivityGroup是继承Activity的,但是这个方法目前已经被弃用了,虽然不推荐使用,不过还是可以用的。以后会讲推荐的做法。我们会用这个类管理界面的实现。ActivityGroup中有一个重要的方法是getLocalActivityManager,这个方法可以销毁和启动新的Activity,并可以通过getDecorView方法获取到启动Activity的根视图显示出来。Activity显示在ActivityGroup中的一个container中,而container是显示Activity的一个区域,这个container必须是ViewGroup或者是其子类。

首先编写一个TabActivity

package com.shamoo.activity;import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;public class TabActivity extends ActivityGroup {private ViewGroup container;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);}/*** 通过id设置Activity显示的container,该container必须是继承ViewGroup的*/protected void setContainer(int resId) {container = (ViewGroup) findViewById(resId);}/*** 通过Activity的class显示Activity*/protected void showActivity(Class<?> activityClass) {Intent intent = new Intent(this, activityClass);// 检查container是否有显示的Activity,如果有,先移除View activity = container.getChildAt(0);if (activity != null) {// 移除显示的activity的Viewcontainer.removeAllViews();// 通过ActivityManager移除activitygetLocalActivityManager().removeAllActivities();}// 启动新的activity,并将该activity的根视图添加到contanier中container.addView(getLocalActivityManager().startActivity(activityClass.getName(), intent).getDecorView());}}

编写一个继承TabActivity的MainActivity管理界面,界面是三个Activity

package com.shamoo.activity;import com.shamoo.activitygroupdemo.R;import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class MainActivity extends TabActivity implements OnClickListener {/*** 显示的三个Activity的class*/private Class<?> activities[] = {OneActivity.class, TwoActivity.class, ThreeActivity.class};/*** 菜单的三个按钮*/private Button[] btn = new Button[3];/*** 当前的选择*/private int currentSelect;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsetContentView(R.layout.activity_main);setContainer(R.id.fl_container);btn[0] = (Button) findViewById(R.id.btn_one);btn[0].setOnClickListener(this);btn[1] = (Button) findViewById(R.id.btn_two);btn[1].setOnClickListener(this);btn[2] = (Button) findViewById(R.id.btn_three);btn[2].setOnClickListener(this);showActivity(activities[0]);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbtn[currentSelect].setBackgroundResource(R.color.normal);switch (v.getId()) {case R.id.btn_one:currentSelect = 0;btn[0].setBackgroundResource(R.color.select);showActivity(activities[0]);break;case R.id.btn_two:currentSelect = 1;btn[1].setBackgroundResource(R.color.select);showActivity(activities[1]);break;case R.id.btn_three:currentSelect = 2;btn[2].setBackgroundResource(R.color.select);showActivity(activities[2]);break;}}}

编写activity_main.xml,该布局有底部菜单的实现,是通过LinearLayout的layout_weight配合修改背景的Button实现的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayoutandroid:id="@+id/rl_menu"android:layout_width="match_parent"android:layout_height="45dp"android:layout_alignParentBottom="true"android:orientation="horizontal" ><Buttonandroid:id="@+id/btn_one"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="#008eff"android:text="1" /><Buttonandroid:id="@+id/btn_two"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="#555555"android:text="2" /><Buttonandroid:id="@+id/btn_three"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="#555555"android:text="3" /></LinearLayout><FrameLayoutandroid:id="@+id/fl_container"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@id/rl_menu" ></FrameLayout>
</RelativeLayout>

然后编写三个Activity,这三个Activity可以自定义。代码比较多,就不全贴出来了。

启动Demo之后,可以看到Activity的生命周期管理是没有问题的

Demo下载链接:http://download.csdn.net/detail/stephenzcl/7306531

Android自定义TabActivity(实现仿新浪微博底部菜单更新UI)相关推荐

  1. Android自己定义TabActivity(实现仿新浪微博底部菜单更新UI)

    现在Android上非常多应用都採用底部菜单控制更新的UI这样的框架,比如新浪微博 点击底部菜单的选项能够更新界面.底部菜单能够使用TabHost来实现,只是用过TabHost的人都知道自己定义Tab ...

  2. Android自定义控制(五)仿新浪微博的下拉刷新

    网上有很多很有名的开源框架,这里就来拉拉PullToRefresh这个框架,也就是我们平时用的下拉刷新啦,当然你问我这个有什么用啊?别人已经写好了,这里主要是学习以及练习,练习的次数多了,一切就顺其自 ...

  3. Android自定义View之仿QQ侧滑菜单实现

    最近,由于正在做的一个应用中要用到侧滑菜单,所以通过查资料看视频,学习了一下自定义View,实现一个类似于QQ的侧滑菜单,顺便还将其封装为自定义组件,可以实现类似QQ的侧滑菜单和抽屉式侧滑菜单两种菜单 ...

  4. android 自定义取色器,【Android自定义View】仿Photoshop取色器ColorPicker(二)

    ColorPicker 一款仿Photoshop取色器的Android版取色器. 前言 上一篇已经简单介绍了ColorPicker的项目结构以及两种颜色空间,接下来我们详细解析一下ColorPicke ...

  5. php仿微信底部菜单,Android实现简单底部导航栏 Android仿微信滑动切换效果

    Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...

  6. 名片夹android布局代码,Android自定义布局实现仿qq侧滑部分代码

    自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下 实现说明: 通过自定义布局实现: SlidingLayout继承于 HorizontalScrollView /** * Cr ...

  7. android自定义控制中心仿vivo

    android自定义仿vivo控制中心(一) (一)寻找全局可执行到的"点" 1.可以全局操作. 2.全局可用 提示 此功能是系列文章(主要是一下子写完太多了,有点费时间),本篇幅 ...

  8. android仿qq布局,Android自定义布局实现仿qq侧滑部分代码

    自定义布局实现仿qq侧滑部分android代码,供大家参考,具体内容如下 实现说明: 通过自定义布局实现: slidinglayout继承于 horizontalscrollview /** * cr ...

  9. Android自定义View之仿QQ运动步数进度效果

    文章目录 前言 先看效果图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6e4ddec17933496ea4830fa08d8ffbe5.png?x-oss-pr ...

最新文章

  1. 重温强化学习之强化学习简介
  2. php socket的一些问题
  3. hdfs里的文件下载HDFS之fsimage、metadata、edits、fstime(二十七)
  4. 数据采集技术的难点在于哪里
  5. eclipse打断点调试进入到class文件中,不显示变量值的解决办法汇总
  6. Flutter之SnackBar原理详解
  7. 【Linux】 Ubuntu intel网卡驱动安装
  8. DCT 离散余弦变换及蝶形算法
  9. iis10 asp 如何连接mdb_看我如何恢复被MaMoCrypt勒索软件加密的数据
  10. python说句心里话a_python第一周作业
  11. 【Python】美国大选献金项目数据分析(concat(),lambda(),groupby(),pivot_table())
  12. 《动物世界》电影 观后感
  13. 和睦家 php研发,豹小秘落户和睦家,探索医疗场景新应用
  14. 惠普bios硬重置_惠普笔记本电脑按什么样键进入BIOS设置?惠普笔记本BIOS密码忘了咋重置...
  15. [AHOI2014/JSOI2014]骑士游戏 深入理解spfa
  16. 关于短视频平台框架搭建与技术选型探讨
  17. 程序员的 100款代码表白特效,一个比一个浪漫
  18. 20802 oracle win7,[Ins-20802] Oracle Database Configuration Assistant failed
  19. 基于SSM的网上餐厅管理系统
  20. python 进行音频处理,单声道变双声道,提升音量

热门文章

  1. cocos2dx安装配置教程
  2. 怎样给U盘加密和怎样给移动硬盘加密
  3. android 钛备份,钛备份下载-钛备份Titanium Backup 安卓版v8.3.2-PC6安卓网
  4. oracle 停止触发器语句,oracle触发器语句
  5. Oracle Golden Gate(OGG)学习——源端安装OGG (数据库版本为Oracle 10g)
  6. 数据库管理员密码的设置
  7. java企业人事工资管理系统
  8. 个人对爬虫框架的一些认知(四)
  9. 大数据升级治霾手段:拒绝“一刀切”误伤
  10. 2021-01-25 matlab2018a license manager error -8简单解决办法