现在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};/*** 菜单的三个button*/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的人都知道自定义TabHos ...

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

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

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

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

  4. 【Android UI设计与开发】第08期:底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9016223       在上一篇文章中,我们花了大量的篇幅来讲解Fragme ...

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

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

  6. android 模仿uc标签页,仿uc浏览器菜单实现【原创】

    UC浏览器的菜单我们可以发现,UC的菜单就是一个个标签页显示在了PopupWindow上,所以可以想到使用PopupWindow+TabHost来实现类似的效果.首先要重写PopupWindow pu ...

  7. iOS: 仿新浪微博 OC (持续更新ing)

    效果图(暂定) 1.配置AppIcon和LaunchImage 2.项目框架初建 需求: 多视图控制器 思路: (1) 自定义一个继承UITabBarController的类作为window的root ...

  8. Android仿微信底部菜单栏+今日头条顶部导航栏

    背景 Android应用几乎都会用到底部菜单栏,在Material Design还没有出来之前,TabHost等技术一直占主流,现在Google新sdk中提供了TabLayout类可以便捷的做出底部菜 ...

  9. android 底部tab效果,Android 仿微信底部渐变Tab效果

    先来看一下效果图 除了第三个的发现Tab有所差别外,其他的基本还原了微信的底部Tab渐变效果 每个Tab都是一个自定义View,根据ImageView的tint属性来实现颜色渐变效果,tint属性的使 ...

最新文章

  1. 2021.9.6 跑FICS【当时的经验】
  2. 滑丝杠上的无触点感应行程开关 SN04-N
  3. Vue实现仿音乐播放器8-实现热门榜单效果
  4. 《炉石传说》的退环境机制失败在哪
  5. 正则表达式不包含某个字符串_JMeter必知必会系列(18) JMeter正则表达式提取器疑难分析...
  6. vue子父组件间传值
  7. mysql 插入优化_MySQL批量SQL插入性能优化
  8. android listpreference 自定义,Android中Fragmen首选项使用自定义的ListPreference的方法
  9. 测试用例编写(功能测试框架)
  10. Android 轮播图从 0 到 1
  11. 企业主要培养三大方向的思考习惯
  12. 真的不再使用*狗输入法了,改七七拼音
  13. 林阳斌集美大学计算机学院,集美大学计算机工程学院导师教师师资介绍简介-林阳斌副教授(2021.04.06)...
  14. Eclipse—在Eclipse中如何创建JavaWeb工程
  15. SQL语句的执行计划
  16. 2021年遥感类SCI期刊JCR分区/中科院分区排名与影响因子汇总
  17. 电信计费系列2-手机+座机计费
  18. 2022-2028年中国物流地产行业市场发展潜力及投资风险预测报告
  19. ubuntu openssl 连接gmial smtp服务
  20. valgrind的使用、原理

热门文章

  1. matlab大地主题正算代码,大地主题解算正算
  2. ESP32接入腾讯云物联网开发平台
  3. 无盘小网吧服务器配置,小网吧无盘服务器最具性价比配置推荐
  4. java企业人事工资管理系统
  5. 这四款良心好用的优质软件,我用了多年,百用不腻
  6. PGP应用——如何使用PGP软件?
  7. 修改mp4文件的moov atom,使其位置在文件的前面
  8. 关于java.sql.SQLException: No suitable driver found for jdbc:mysql:
  9. 最优打字策略 java_打字练习Java程序,求高手完善!30 爱问知识人
  10. xshell如何复制粘贴外面的内容?