- 浏览: 148411 次
文章分类
最新评论
-
zhufoxmailcn:
有希望了!但原能解决小米二电信与4G卡的短信兼容性问题
android无法自动识别sim卡中短信中心号码(SMSC刷新error)的解决方法 -
dss16694:
hotdll 写道l楼主一不小心泄露了自己的手机号码?那是短信 ...
android无法自动识别sim卡中短信中心号码(SMSC刷新error)的解决方法 -
hotdll:
l楼主一不小心泄露了自己的手机号码?
android无法自动识别sim卡中短信中心号码(SMSC刷新error)的解决方法 -
hotdll:
hotdll 写道我的手机是E10I 分辨率为240*320的 ...
CM7最新联系人代码(追加自动IP拨号、拼音首字母快速检索等功能) -
hotdll:
我的手机是E10I 分辨率为240*320的,miniCM7, ...
CM7最新联系人代码(追加自动IP拨号、拼音首字母快速检索等功能)
前言
为了更好的开发Android应用程序,除了熟练掌握基本的UI组件和API外,还需要掌握一些技巧,而这些技巧可以通过阅读一些代码来提高,本系列将与大家分享一些新浪微博布局方面的收获,欢迎交流!
声明
欢迎转载,但请保留文章原始出处:)
博客园:http://www.cnblogs.com
农民伯伯: http://www.cnblogs.com/over140
版本
新浪微博 weibo_10235010.apk
正文
一、效果图
红色部分是本文要实现的目标。
二、实现maintabs.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
- <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="0.0dip" android:layout_weight="1.0" />
- <TabWidget android:id="@android:id/tabs" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.0" />
- <RadioGroup android:gravity="center_vertical" android:layout_gravity="bottom" android:orientation="horizontal" android:id="@id/main_radio" android:background="@drawable/maintab_toolbar_bg" android:layout_width="fill_parent" android:layout_height="wrap_content">
- <RadioButton android:text="@string/main_home" android:checked="true" android:id="@+id/radio_button0" android:layout_marginTop="2.0dip" android:drawableTop="@drawable/icon_1_n" style="@style/main_tab_bottom" />
- <RadioButton android:id="@+id/radio_button1" android:layout_marginTop="2.0dip" android:text="@string/main_news" android:drawableTop="@drawable/icon_2_n" style="@style/main_tab_bottom" />
- <RadioButton android:id="@+id/radio_button2" android:layout_marginTop="2.0dip" android:text="@string/main_my_info" android:drawableTop="@drawable/icon_3_n" style="@style/main_tab_bottom" />
- <RadioButton android:id="@+id/radio_button3" android:layout_marginTop="2.0dip" android:text="@string/menu_search" android:drawableTop="@drawable/icon_4_n" style="@style/main_tab_bottom" />
- <RadioButton android:id="@+id/radio_button4" android:layout_marginTop="2.0dip" android:text="@string/more" android:drawableTop="@drawable/icon_5_n" style="@style/main_tab_bottom" />
- </RadioGroup>
- </LinearLayout>
- </TabHost>
styles.xml
- <style name="main_tab_bottom">
- <item name="android:textSize">@dimen/bottom_tab_font_size</item>
- <item name="android:textColor">#ffffffff</item>
- <item name="android:ellipsize">marquee</item>
- <item name="android:gravity">center_horizontal</item>
- <item name="android:background">@drawable/home_btn_bg</item>
- <item name="android:paddingTop">@dimen/bottom_tab_padding_up</item>
- <item name="android:layout_width">fill_parent</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:button">@null</item>
- <item name="android:singleLine">true</item>
- <item name="android:drawablePadding">@dimen/bottom_tab_padding_drawable</item>
- <item name="android:layout_weight">1.0</item>
- </style>
home_btn_bg.xml
- <selector
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="true" android:state_enabled="true" android:state_pressed="false" android:drawable="@drawable/home_btn_bg_s" />
- <item android:state_enabled="true" android:state_pressed="true" android:drawable="@drawable/home_btn_bg_s" />
- <item android:state_enabled="true" android:state_checked="true" android:drawable="@drawable/home_btn_bg_d" />
- <item android:drawable="@drawable/transparent" />
- </selector>
代码说明:
1. 需要注意的是他这里把TabWidget的Visibility设置成了gone!也就是默认难看的风格不见了: ,取而代之的是5个带风格的单选按钮.
2. 注意为单选按钮设置的style,其中最重要的是为其background设置了home_btn_bg.xml,也就是自定义了选中效果。
Java文件
- public class MainTabActivity extends TabActivity implements
- OnCheckedChangeListener {
- private TabHost mHost;
- private Intent mMBlogIntent;
- private Intent mMoreIntent;
- private Intent mInfoIntent;
- private Intent mSearchIntent;
- private Intent mUserInfoIntent;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.maintabs);
- // ~~~~~~~~~~~~ 初始化
- this.mMBlogIntent = new Intent(this, HomeListActivity.class);
- this.mSearchIntent = new Intent(this, SearchSquareActivity.class);
- this.mInfoIntent = new Intent(this, MessageGroup.class);
- this.mUserInfoIntent = new Intent(this, MyInfoActivity.class);
- this.mMoreIntent = new Intent(this, MoreItemsActivity.class);
- initRadios();
- setupIntent();
- }
- /**
- * 初始化底部按钮
- */
- private void initRadios() {
- ((RadioButton) findViewById(R.id.radio_button0)).setOnCheckedChangeListener(this);
- ((RadioButton) findViewById(R.id.radio_button1)).setOnCheckedChangeListener(this);
- ((RadioButton) findViewById(R.id.radio_button2)).setOnCheckedChangeListener(this);
- ((RadioButton) findViewById(R.id.radio_button3)).setOnCheckedChangeListener(this);
- ((RadioButton) findViewById(R.id.radio_button4)).setOnCheckedChangeListener(this);
- }
- /**
- * 切换模块
- */
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if (isChecked) {
- switch (buttonView.getId()) {
- case R.id.radio_button0:
- this.mHost.setCurrentTabByTag("mblog_tab");
- break;
- case R.id.radio_button1:
- this.mHost.setCurrentTabByTag("message_tab");
- break;
- case R.id.radio_button2:
- this.mHost.setCurrentTabByTag("userinfo_tab");
- break;
- case R.id.radio_button3:
- this.mHost.setCurrentTabByTag("search_tab");
- break;
- case R.id.radio_button4:
- this.mHost.setCurrentTabByTag("more_tab");
- break;
- }
- }
- }
- private void setupIntent() {
- this.mHost = getTabHost();
- TabHost localTabHost = this.mHost;
- localTabHost.addTab(buildTabSpec("mblog_tab", R.string.main_home,
- R.drawable.icon_1_n, this.mMBlogIntent));
- localTabHost.addTab(buildTabSpec("message_tab", R.string.main_news,
- R.drawable.icon_2_n, this.mInfoIntent));
- localTabHost.addTab(buildTabSpec("userinfo_tab", R.string.main_my_info,
- R.drawable.icon_3_n, this.mUserInfoIntent));
- localTabHost.addTab(buildTabSpec("search_tab", R.string.menu_search,
- R.drawable.icon_4_n, this.mSearchIntent));
- localTabHost.addTab(buildTabSpec("more_tab", R.string.more,
- R.drawable.icon_5_n, this.mMoreIntent));
- }
- private TabHost.TabSpec buildTabSpec(String tag, int resLabel, int resIcon,
- final Intent content) {
- return this.mHost
- .newTabSpec(tag)
- .setIndicator(getString(resLabel),
- getResources().getDrawable(resIcon))
- .setContent(content);
- }
代码说明
1. 由于TabWidget被隐藏,所以相关的事件也会无效,这里取巧用RadioGroup与RadioButton的特性来处理切换,然后监听事件调用setCurrentTabByTag来切换Activity。
2. 注意即使TabWidget被隐藏,也要为其设置indicator,否则会保持。
三、总结
在这之前如果要做这种效果我恐怕第一时间就会想到用ActivityGroup来做,主要是因为TabHost的TabWidget非常难看,用起 来也不方便。其实从源码可以看出,TabActivity也是继承自ActivityGroup,这里结合了单选按钮和TabHost,各取其长,有时间 可以专门写一个这样的自定义控件:)
四、相关文章
[Android]使用ActivityGroup来切换Activity和Layout
结束
本文中使用的资源均反编译自apk文件,这里主要是讲思路,欢迎大家交流。
示例DEMO:
- SinaWeibo.zip (119.2 KB)
- 下载次数: 162
发表评论
-
读懂diff
2015-09-10 16:50 606转自http://www.ruanyifeng.com/bl ... -
【转】努比亚手机玩转双系统
2014-08-21 16:16 0转自miui论坛:http://www. ... -
Z7 MAX 原厂ROM内核修改
2014-08-21 16:04 0努比亚的Z7 MAX出厂时预装NUBIA UI,说实话不咋地 ... -
(转)boot.img的结构
2014-08-21 15:58 1010转自CSDN:http://blog.csdn.net/z ... -
android手机霍尔开关的介绍
2014-08-11 15:24 9461转自CSDN:http://blog.csdn.net/wl ... -
(转)Ubuntu11.10(32位)编译android常见错误(30种常见的)
2014-04-01 13:58 0开始正式编译,在源码目录下make即可。 make ... -
Mokee适配教程(从CM10适配)
2013-09-10 11:27 2564转自魔趣论坛,原始链接为: http://bbs.mfu ... -
ubuntu 12.04 android 编译环境搭建
2013-07-21 06:30 980参考:http://source.android. ... -
miui V5收费主题破解
2013-04-14 01:17 0看到有个家伙在淘宝上卖这东西,感觉有点过分,号称历时2个月才 ... -
Scrolling cache关闭
2013-04-14 00:51 0Scrolling cache关闭后,感觉没什么效果吧。可以用 ... -
ubuntu 12.04的代理设置
2013-04-09 15:48 1715ubuntu 12.04的代理设置 ... -
重新打包ubi镜像
2013-03-18 15:51 2266从网上了解到ubi image不能像其他格式的文件系统ima ... -
为android增加重启菜单
2013-03-17 16:06 1937转自:http://blog.csdn.net/zzp16/ ... -
小米更改第一屏
2013-03-12 11:39 914su dd if=/sdcard/emmc_appsboo ... -
远程发送开机指令
2013-02-28 15:26 1657转发一段用java发送远程开机数据包的代码: 另外,在线发 ... -
tesseract3语言训练
2013-01-06 23:26 1169http://blog.wudilabs.org/entry/ ... -
安卓窗口动画修改制作心得,定制属于你自己的特效动画
2012-12-26 13:07 2054转载自:http://www.miui.com/thread- ... -
(转)android系统特效详解和修改方法
2012-12-20 12:03 1510转自安智网:http://bbs.anzhi.com/foru ... -
socket编程
2012-08-01 17:06 1060暂时先贴下地址,省的忘记: http://duguyi ... -
CM9(4.0.4)状态栏美化(青白色风格)
2012-07-31 23:35 2977以下操作均在SystemUI.apk反编译所得文件的基础上进行 ...
相关推荐
本Demo是针对新浪微博Android版的底部工具栏实现,旨在帮助开发者了解如何在自己的应用中实现类似的功能。 首先,我们要理解底部工具栏的设计原则。根据Google的Material Design规范,底部工具栏应该包含3到5个主要...
这个“Android底部菜单栏”教程是为初学者设计的,旨在帮助他们理解如何在Android应用中实现这一功能。我们将主要探讨TabHost组件,它是Android早期版本中用来实现标签页式导航的一种方式。 首先,我们需要了解底部...
1. 使用`BottomNavigationView`:这是Android Support Library提供的一个组件,可以轻松创建底部导航栏。在XML布局文件中添加`<android.support.design.widget.BottomNavigationView>`标签,然后在Java或Kotlin代码...
"仿夸克主页底部工具栏 仿Android系统通知栏层叠列表"这个项目旨在实现一种类似于夸克浏览器主页底部工具栏的效果,并结合了Android系统通知栏的层叠列表样式。这个设计模式常见于许多现代Android应用,它可以提升...
总之,创建一个Android底部菜单栏需要理解`BottomNavigationView`的工作原理,以及如何结合`MenuItem`和`Fragment`来响应用户的交互。同时,掌握好Android布局管理、事件监听和数据绑定等基本概念也是必不可少的。...
RK系列 Android系统隐藏工具栏虚拟按键Jar包
【安卓底部工具栏】是Android应用开发中常见的一种界面元素,通常称为Bottom Navigation Bar或Bottom Bar。它位于屏幕底部,包含几个图标或者文字标签,用于快速在应用的主要功能之间切换,提升用户操作效率和用户...
Menu是Android应用中提供用户操作的一种方式,通常用于Activity的选项菜单、上下文菜单或工具栏中。在底部导航栏中添加加号(+)弹出菜单,我们需要自定义一个BottomNavigationView,并结合PopupMenu或者...
在Android中,我们可以使用`BottomNavigationView`组件来创建底部工具栏。首先,在布局文件中添加该组件,然后设置相应的菜单资源,最后在Activity或Fragment中绑定并配置它。例如: ```xml <com.google.android....
通用底部工具栏</title> <style> .footbar_wrap{ position:fixed; bottom:0; left:0;width:100%; height:24px;} .footbar{ width:100%; height:24px;line-height:24px; font-size:14px; margin:0 auto; background...
总之,通过合理利用Android提供的布局工具和组件,我们可以实现功能完备、用户体验良好的自定义底部导航栏和消息显示功能。在实际开发过程中,还需关注性能优化,如避免过度绘制,减少布局层次,以及适时使用...
本项目"Android-BottomNavigation"旨在模仿闲鱼App的底部菜单栏,允许开发者根据需求自定义菜单的数量和大小,以满足更加个性化的界面设计。 在Android开发中,实现自定义BottomNavigationView的关键知识点包括: ...
在Android应用开发中,工具栏(Toolbar)是作为Action Bar的替代品引入的,它提供了更大的自定义灵活性。"Transparent-Delegate-Toolbar"是一个开源项目,专注于实现Android应用中的透明工具栏效果。这个项目旨在...
在Android应用开发中,微信底部导航栏是一种常见的用户界面设计,它允许用户在多个视图之间轻松切换,而无需返回上一级或启动新的活动。这种设计通常由一个底部导航条组成,包含几个图标按钮,每个按钮对应一个不同...
在Android应用设计中,底部导航栏(Bottom Navigation Bar)是一个常见的组件,用于在多个主视图之间提供平滑的导航。在这个讨论中,我们将深入探讨如何使用Jetpack Compose来创建一个“完美的”底部导航栏。 首先...
在本文中,我们将探讨如何创建和封装一个仿微信底部导航栏,并通过一个工具类实现界面切换。 首先,我们要理解微信底部导航栏的核心功能:响应用户的点击事件,更新选中状态,并相应地切换显示的内容。在Android...
总的来说,TabLayout、BottomNavigationView和FragmentTabHost都是Android中实现底部导航的有效工具,选择哪一种取决于项目需求、兼容性考虑以及对Material Design规范的遵循程度。TabLayout和BottomNavigationView...
总的来说,`bottombar`是一个强大的工具,它简化了Android应用底部导航栏的实现过程,提供了丰富的自定义选项,帮助开发者打造具有个性化风格的应用。通过熟练掌握这个库,开发者可以提升应用的用户体验,同时节约...
在Android应用开发中,底部导航栏(Bottom Navigation Bar)是一种常见的UI设计,用于在多个主要功能之间提供平滑的切换。本主题将专注于使用LinearLayout来实现这一功能,LinearLayout是Android布局系统中的一个...