现在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; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.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的View
container.removeAllViews();
// 通过ActivityManager移除activity
getLocalActivityManager().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}; /**
* 菜单的三个button
*/
private Button[] btn = new Button[3]; /**
* 当前的选择
*/
private int currentSelect; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
setContentView(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]);
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
btn[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" > <LinearLayout
android:id="@+id/rl_menu"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_alignParentBottom="true"
android:orientation="horizontal" >
<Button
android:id="@+id/btn_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#008eff"
android:text="1" />
<Button
android:id="@+id/btn_two"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#555555"
android:text="2" />
<Button
android: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> <FrameLayout
android: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. 安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

    记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安 ...

  2. 转-Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

    http://www.cnblogs.com/lichenwei/p/3985121.html 记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果, ...

  3. Android中软键盘弹出时底部菜单上移问题

    当在Android的layout设计里面如果输入框过多,则在输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不能获取焦点输入. 解决办法: 方法一:在你的activity中的oncrea ...

  4. android 自己定义标签的使用,实现扁平化UI设计

    2014年8月6日11:06:44 android对自己定义标签的使用.实现扁平化UI设计: 1.attrs.xml文件里自己定义标签 如: <?xml version="1.0&qu ...

  5. Android开发学习之路-使用Handler和Message更新UI

    在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用到Handler和Message来实现 Demo中,使用到一 ...

  6. android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面

    下面是快速创建一个新线程的方法: 第一种:直接创建子线程并启动      new Thread() {@Overridepublic void run() {     //这里写入子线程需要做的工作  ...

  7. Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新

    现在很多APP,如微信.QQ.微博等等,它们的主页面都无一例外的选择使用底部Tab导航, 通过这种方式,可以很好的把页面层级分化,很好的提高用户体验.相信,很多Android开发者,都使用到过这种经典 ...

  8. <Android 基础(三十三)> TabHost ~ 仿微信底部菜单

    简介 Container for a tabbed window view. This object holds two children: a set of tab labels that the ...

  9. 底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏

    一.实现效果图 二.项目工程结构 三.详细代码编写 1.主tab布局界面,main_tab_layout: 双击代码全选 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

随机推荐

  1. HDU 5372 Segment Game

    /** 多校联合2015-muti7-1004 <a target=_blank href="http://acm.hdu.edu.cn/showproblem.php?pid=537 ...

  2. R语言的帮助使用和图形功能简单介绍

    R语言的帮助使用和图形功能简单介绍 R语言帮助,在Windows桌面下,有很多种.最长使用的是在命令行下help() > help.start() 会在浏览器中,打开帮助的主页 watermar ...

  3. 機器學習基石 机器学习基石 (Machine Learining Foundations) 作业2 Q16-18 C++实现

    大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业2 Q16-18的C++实现.尽管有非常多大神已经 ...

  4. linux 下password加密程序(能够用于替换shadow文件里的用户password)

    源代码例如以下: #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]){ if(arg ...

  5. 广东工业大学2016校赛决赛-网络赛 1169 Problem A: Krito的讨伐 优先队列

    Problem A: Krito的讨伐 Description Krito终于干掉了99层的boss,来到了第100层.第100层可以表示成一颗树,这棵树有n个节点(编号从0到n-1),树上每一个节点 ...

  6. iOS 判断是否有权限访问相机,相册

    1.判断用户是否有权限访问相册 #import <AssetsLibrary/AssetsLibrary.h> ALAuthorizationStatus author =[ALAsset ...

  7. php面向对象之__isset和__unset

    php面向对象之__isset和__unset 一.简介 __isset和__unset都是对不可访问属性的操作,前者是检验的时候自动调用,后者是销毁的时候自动调用. 比如说在类外访问private的 ...

  8. hdoj--2122--Ice_cream’s world III(克鲁斯卡尔)

    Ice_cream's world III Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. WebRTC开源项目一览之二

    .Kurento视频直播系统4.1  应用实例搞视频会议就会涉及一对多.多对多.广播.转码.混音.合屏.录制,这就需要用到流媒体服务器,而kurento就具有这些功能.他主要用来作为webrtc的流媒 ...

  10. 解析RecyclerView(2)——带顶部View和底部View的RecyclerView

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...