Android TabHost中实现标签的滚动以及一些TabHost开发的奇怪问题

最近在使用TabHost的时候遇到了一些奇怪的问题,在这里总结分享备忘一下。

首先说一点TabActivity将会被FragmentActivity所替代,但是本文中却是使用的TabActivity。

下面说说本程序能够实现的功能:

  1. 实现TabHost中的标题栏能够横向滚动;
  2. 自定义标题栏的大小和样式;
  3. 自定义标题栏的分割线的样式;

下面分几步来分别实现以上的功能:

第一步,先实现一个基本的TabHost的展现

详细的说明可以在网上其它地方搜的,主要就是注意一点,控件的id的是固定的不能随便更改,并且@和id之间不能加+;

Activity的代码如下:

public class TabhostTestActivity extends TabActivity implementsTabContentFactory {private final String[] tabTitle = { "测试Tab标签1", "测试Tab标签2", "测试Tab标签3","测试Tab标签4", "测试Tab标签5", "测试Tab标签6", "测试Tab标签7", "测试Tab标签8","测试Tab标签9" };/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.tabhost);TabHost th = getTabHost();for (int i = 0; i < tabTitle.length; i++) {TextView view = (TextView) getLayoutInflater().inflate(R.layout.tabwighet, null);view.setText(tabTitle[i]);th.addTab(th.newTabSpec(tabTitle[i]).setIndicator(view).setContent(this));}}@Overridepublic View createTabContent(String tag) {View view = new View(this);if (tabTitle[0].equals(tag)) {view.setBackgroundColor(Color.BLUE);} else if (tabTitle[1].equals(tag)) {view.setBackgroundColor(Color.CYAN);} else if (tabTitle[2].equals(tag)) {view.setBackgroundColor(Color.DKGRAY);} else if (tabTitle[3].equals(tag)) {view.setBackgroundColor(Color.GRAY);} else if (tabTitle[4].equals(tag)) {view.setBackgroundColor(Color.GREEN);} else if (tabTitle[5].equals(tag)) {view.setBackgroundColor(Color.LTGRAY);} else if (tabTitle[6].equals(tag)) {view.setBackgroundColor(Color.MAGENTA);} else if (tabTitle[7].equals(tag)) {view.setBackgroundColor(Color.RED);} else if (tabTitle[8].equals(tag)) {view.setBackgroundColor(Color.YELLOW);}return view;}
}

对应的layout的xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TabHostandroid:id="@android:id/tabhost"android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TabWidgetandroid:id="@android:id/tabs"android:layout_width="wrap_content"android:layout_height="wrap_content" ></TabWidget><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="match_parent"android:layout_height="match_parent" ></FrameLayout></LinearLayout></TabHost></LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center"android:singleLine="true" />

运行后的效果图如下(平板1280*800的设备):

第二步,给标签栏添加横向的滚动操作

这个很简单,只需要修改一下tabhost.xml即可:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TabHostandroid:id="@android:id/tabhost"android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><HorizontalScrollViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:fillViewport="true"android:scrollbars="none" ><TabWidgetandroid:id="@android:id/tabs"android:layout_width="wrap_content"android:layout_height="wrap_content" ></TabWidget></HorizontalScrollView><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="match_parent"android:layout_height="match_parent" ></FrameLayout></LinearLayout></TabHost></LinearLayout>

运行效果如下:

第三步,修改标签的宽度和高度

这里要改2个地方,一个是activity中,一个是tabwighet.xml中;

首先说明一下tabwighet.xml修改,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:gravity="center_horizontal"android:orientation="vertical" ><TextViewandroid:id="@+id/tv_title"android:layout_width="200dp"android:layout_height="50dp"android:layout_gravity="center"android:gravity="center"android:singleLine="true" /></LinearLayout>

其中需要注意一点,设置标签的宽度和高度不能设置到LinearLayout上,否则设置的宽度和高度不起作用。

Activity的修改就很简单了,根据tabwighet.xml的修改稍微调整一下代码即可,修改的代码如下:

          LinearLayout view = (LinearLayout) getLayoutInflater().inflate(
                     R.layout.tabwighet, null);
             ((TextView) view.findViewById(R.id.tv_title)).setText(tabTitle[i]);

运行的效果如下:

第四步,修改标签的样式,增加背景图片和选中的状态,以及选中后的字体的颜色

 首先修改tabhost.xml文件,为HorizontalScrollView和FrameLayout添加设置background的属性,图片自己选个即可。代码如下:

<HorizontalScrollViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/ic_tab_header_background"android:fillViewport="true"android:scrollbars="none" ><TabWidgetandroid:id="@android:id/tabs"android:layout_width="wrap_content"android:layout_height="wrap_content" ></TabWidget></HorizontalScrollView><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/ic_tab_body_background" ></FrameLayout>

然后在drawable文件夹中添加2个selector,一个是用来设置选中的标签的背景的,一个是用来设置选中的字体颜色变化的,代码如下:

 <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/tabbar_bg_selected" android:state_selected="true"></item><item android:drawable="@android:color/transparent" android:state_selected="false"></item>
</selector>
 <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:color="#9d9d9d" android:state_selected="false"></item><item android:color="@android:color/black" android:state_selected="true"></item></selector>

最后修改tabwighet.xml将样式添加到标签上:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:background="@drawable/selector_tab_header_item_background"android:gravity="center_horizontal"android:orientation="vertical" ><TextViewandroid:id="@+id/tv_title"android:layout_width="200dp"android:layout_height="50dp"android:layout_gravity="center"android:gravity="center"android:singleLine="true"android:textColor="@drawable/selector_tab_header_item_txt_color" />
</LinearLayout>

运行效果如下:

第五步,添加tabhost中标签间的分割线

修改tabhost.xml的代码为:

     <TabWidgetandroid:id="@android:id/tabs"android:layout_width="wrap_content"android:layout_height="wrap_content"android:divider="@drawable/ic_tabbar_divider" ></TabWidget>

效果图如下:

以上几步就完成了我们预定的3个功能。

下面是我在开发中遇到的几个特使的问题,总结一下并列出我的解决方法:

1.标签的宽度总是设置不成功——请参照第三步操作,这里注意设置最外边的view的宽度是不能控制标签的宽度的。

2.标签间设置的自定义分割图片总是不显示——检查AndroidManifest.xml中是不是设置了application的 android:theme属性,如果设置成了@android:style/Theme.NoTitleBar,那么设置的分割是不能正常显示的(初步 测试设置了与NoTitleBar有关的样式的属性都不能显示),如果设置这个属性是为了隐藏actionbar,建议修改成 @android:style/Theme.DeviceDefault.NoActionBar。

 

转载于:https://www.cnblogs.com/zhujiabin/p/4276492.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tl wn322g linux驱动下载,怎样才能装好tl_wn322G+V2.0版USB无线网卡的Linux驱动

怎样才能装好tl_wn322GV2.0版USB无线网卡的Linux驱动tl_wn322G 2.0版无线网卡采用的是Atheros 的AR9271方案&#xff0c;我尝试了用ndiswrapper-1.55在linux下安装该无线网卡的Windows驱动&#xff0c;安装windows版的驱动时&#xff0c;用ndiswrapper -l &#xff0c;显示为错…

Spring + Dubbo + zookeeper (linux) 框架搭建

2019独角兽企业重金招聘Python工程师标准>>> dubbo简介 节点角色说明&#xff1a; Provider: 暴露服务的服务提供方。 Consumer: 调用远程服务的服务消费方。 Registry: 服务注册与发现的注册中心。 Monitor: 统计服务的调用次调和调用时间的监控中心。 Container: …

c语言 函数编程四个数相加,C语言第四章课后编程题

1.编写程序&#xff0c;从键盘上输入4个整数&#xff0c;输出最小值。此题较为简单&#xff0c;只需定义一个桥梁最小值min就可以来着次比较他们的大小。2.编写一个程序&#xff0c;从键盘输入一个四位整数n&#xff0c;输出它的各位数字之和。例如n1308&#xff0c;则输出12&a…

[raywenderlich教程]

非常详细的图文入门教程http://www.raywenderlich.com/81879/storyboards-tutorial-swift-part-1 因为太长了 所以只放一些我觉得很有用的内容的翻译 The single View Controller you defined was set as the Initial View Controller – but how did the app load it? Take a…

c语言scanf附加格式*,C语言的scanf语句格式

满意答案pihiac2014.09.05采纳率&#xff1a;45% 等级&#xff1a;7已帮助&#xff1a;460人scanf语句的一般格式如下&#xff1a;scanf("格式字符串", 地址&#xff0c;…);scanf语句用"格式字符串"控制键盘读入的方式。"格式字符串"中一般只…

YUV格式像素

转自&#xff1a;http://blog.csdn.net/grow_mature/article/details/9004548 一幅彩色图像的基本要素是什么&#xff1f; 说白了&#xff0c;一幅图像包括的基本东西就是二进制数据&#xff0c;其容量大小实质即为二进制数据的多少。一幅1920x1080像素的YUV422的图像&#xff…

从零开始学android开发-布局中 layout_gravity、gravity、orientation、layout_weight

线性布局中&#xff0c;有 4 个及其重要的参数&#xff0c;直接决定元素的布局和位置&#xff0c;这四个参数是 android:layout_gravity ( 是本元素相对于父元素的重力方向 ) android:gravity &#xff08;是本元素所有子元素的重力方向&#xff09; android:orientation &…

Thread详解

具体可参考&#xff1a;Java并发编程&#xff1a;Thread类的使用&#xff0c;这里对线程状态的转换及主要函数做一下补充。 一. 线程状态转换图 注意&#xff1a; 调用obj.wait()的线程需要先获取obj的monitor&#xff0c;wait()会释放obj的monitor并进入等待态。所以wait()/no…

linux 欢迎语,一日一技 | 如何让你的终端欢迎语好看又有趣

原标题&#xff1a;一日一技 | 如何让你的终端欢迎语好看又有趣Matrix 精选Matrix 是少数派的写作社区&#xff0c;我们主张分享真实的产品体验&#xff0c;有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章&#xff0c;展示来自用户的最真实的体验和观点。文章代…

springmvc 1

springmvc的model是实体类&#xff0c;可以理解为把数据库里的一张表变成了一个对象 /*** */ package com.test.model;/*** ClassName: User.java* Description: TODO(用一句话描述该文件做什么) * * author JerryZhou* Date 2014-7-15 上午10:24:04 *…

android java adb命令大全,Android adb命令备份恢复手机信息

假设你已经在Windows下安装了Android SDK&#xff0c;并且更新到最新版步骤&#xff1a;1.通过USB连接你的设备&#xff0c;打开命令行2.一般地&#xff0c;输入”adb devices“检测设备是否连接正常有个命令“ adb backup”(简化写法)可以使你备份整个系统。这个命令的参数如下…

【HDOJ】【3037】Saving Beans

排列组合 啊……这题是要求c(n-1,0)c(n,1)c(n1,2)......c(nm-1,m) 这个玩意……其实就等于c(nm,m) 好吧然后就是模P……Lucas大法好 我SB地去预处理<P的所有fac和inv了……果断TLE 事实上Lucas时对于<P的部分直接暴力算就好了 1 //HDOJ 30372 #include<cstdio>3 #…

miui12 android系统耗电,miui12耗电严重怎么办,miui12续航优化方法

很多小米用户反馈升级到miui12稳定版后耗电大大增加&#xff01;再大的电池也经不住miui12的耗电&#xff01;那么miui12耗电严重怎么办&#xff1f;miui12续航优化的方法呢&#xff1f;一起和XDA小编看看吧&#xff01;近日&#xff0c;有网友对此提供了优化miui12耗电的方法&…

r6400 usb android,网件R6400路由器USB接口速率测试与总结

网件R6400路由器USB接口速率测试测试中使用的是浦科特M6V 256GB固态硬盘搭配USB3.0硬盘盒进行测试&#xff0c;此外由于无线网络速率有一定的波动&#xff0c;对最终测试成绩测试成绩有较大的影响&#xff0c;因此我们使用网速相对稳定的千兆有线网络连接路由器进行测试。首先我…

只用2000行代码实现google protocol buffer c++版的功能

2019独角兽企业重金招聘Python工程师标准>>> google protocol buffer (下面简称gpb)功能强大&#xff0c;应用广泛&#xff0c;但在实际应用中&#xff0c;gpb需要写.proto脚本文件&#xff0c;需要依赖.lib库&#xff0c;还需要为每个消息体生成一大堆难以阅读的C代…

流控思路——多消费者定量生产(第100篇)

为什么80%的码农都做不了架构师&#xff1f;>>> 多线程消费队列到指定个数时触发一个生产线程往队列中补充元素&#xff0c;保证队列中有足够的数据供消费&#xff0c;不至于使消费线程等待&#xff0c;也不至于在队列中堆得过多。假设10人消费&#xff0c;先放2个…

使用JetBrains dotMemory 4.0分析内存

安装下载地址&#xff1a;http://www.jetbrains.com/profiler/ 1.在本地启动web应用后&#xff0c;打开dotMemory,附加进程 2.附加后会看到集中颜色得粗条&#xff0c;不断往左边走动&#xff0c;这是内存运行情况&#xff0c; 3.Get snapshot,抓取两次快照&#xff0c;等自动信…

AutoHomeRefreshListView仿汽车之家下拉刷新 《IT蓝豹》

2019独角兽企业重金招聘Python工程师标准>>> AutoHomeRefreshListView仿汽车之家下拉刷新 AutoHomeRefreshListView 高仿汽车之家下拉刷新 &#xff0c;下拉的时候出现很不错的效果。本项目来自&#xff1a;https://github.com/nugongshou110/AutoHomeRefreshListVi…

Java JVM、JNI、Native Function Interface、Create New Process Native Function API Analysis

目录 1. JAVA JVM 2. Java JNI: Java Native Interface 3. Java Create New Process Native Function API Analysis In Linux 4. Java Create New Process Native Function API Analysis In Windows 1. JAVA JVM 0x1: JVM架构简介 JVM是Java Virtual Machine(Java虚拟机)的缩写…

小android模拟器,小姚Android模拟器工作室版本v6.2.7.0正式版

逍遥Android Emulator Studio Edition是高质量的Android模拟器. 此版本是特殊版本&#xff0c;支持无限的多打开&#xff0c;智能管理和组控制模式. 它是专门为需要商业营销的用户设计的. Xiaoyao Android Emulator Studio Edition具有强大的引擎和良好的兼容性全能营销王 安卓…