- 浏览: 251532 次
- 性别:
- 来自: 内蒙古
文章分类
- 全部博客 (237)
- Android 功能实现 (31)
- sql数据库的学习 (8)
- Android 美化界面 (2)
- Android 优化 (1)
- Ruby on Rails 方面 (45)
- git 方面的学习 (1)
- ruby 编程的琢磨 (13)
- linux下工具软件 (13)
- 操作系统的学习 (40)
- 非技术 (13)
- 网站开发 (18)
- js 学习笔记 (19)
- css学习 (5)
- 回顾总结 (2)
- Delphi 学习 (2)
- C 语言学习笔记 (1)
- 数据结构 (1)
- node js 学习 (6)
- 设计模式 (2)
- mongdb 学习笔记 (0)
- 软件服务 (3)
- osx系统 (4)
- 搜索引擎 (1)
- 测试工具 (1)
- Aliyun (1)
- 前端JS (1)
- python学习 (0)
- iOS系统 (1)
- 分布式锁 (1)
- 开发工具 (0)
- java代码 (2)
- java (1)
最新评论
-
jiguanghover:
写的不错,收藏一下
Ubuntu下RVM, Ruby, rails安装详细 和 卸载 -
maoghj:
回顾总结(二) -
yun2223:
对楼主表示感谢
Android控件开发之Gallery3D效果 -
zw_lovec:
说清楚点吧 亲 加点注释
out of memory -
lzyfn123:
http://www.iteye.com/images/smi ...
ruby-string 字符串的学习
在上一篇文章“ TabHost 用法”中我们介绍了通过TabHost实现标签页效果。但是在实际项目中我们可能更希望定义自己的 Tab标签 样式使界面效果更佳。既然不能改变系统的 Tab 样式,那么我们可以选择隐藏系统的东西,使用自己定义的东西(这种方式很好用,以后会详细介绍)。反编译新浪微博的项目后会发现,他们在布局中隐藏了 TabWidget 即 Tab 标签而使用一组 RadioButton 来代替。既然是自己定义的,那肯定是可以自己决定显示样式了,那我们的问题也就解决了。 这里我使用的是“ TabHost 用法—两种实现方式”一文种提到的第二种实现方式,继承 Activity 来使用 TabHost 的。先把代码贴上来(红色字体部分为修改或添加的代码)。
TabHostActivity.java
public class TabHostActivity extends Activity implements
OnCheckedChangeListener {
private TabHost tabHost ;
private Intent certificateIntent ;
private Intent feeIntent ;
private Intent scoreIntent ;
private Intent studyIntent ;
private Intent moreIntent ;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. tab );
// tabHost = getTabHost();
tabHost = (TabHost) findViewById(R.id. my_tabhost );
LocalActivityManager groupActivity =
new LocalActivityManager( this , false );
groupActivity.dispatchCreate(savedInstanceState);
tabHost .setup(groupActivity);
initIntent();
addSpec();
((RadioGroup) findViewById(R.id.tab_radiogroup ))
.set OnCheckedChangeListener (this );
}
/**
* 初始化各个 tab 标签对应的 intent
*/
private void initIntent() {
studyIntent = new Intent( this , StudyActivity. class );
scoreIntent = new Intent( this , ScoreActivity. class );
feeIntent = new Intent( this , FeeActivity. class );
certificateIntent = new Intent( this , CertificateActivity. class );
moreIntent = new Intent( this , MoreActivity. class );
}
/**
* 为 tabHost 添加各个标签项
*/
private void addSpec() {
tabHost .addTab( this .buildTagSpec( "tab_study" , R.string. study_progress ,
R.drawable. account01 , studyIntent ));
tabHost .addTab( this .buildTagSpec( "tab_score" , R.string. test_score ,
R.drawable. account02 , scoreIntent ));
tabHost .addTab( this .buildTagSpec( "tab_fee" , R.string. fee_pay ,
R.drawable. account03 , feeIntent ));
tabHost .addTab( this .buildTagSpec( "tab_certificate" ,
R.string. certificate_grant , R.drawable. account04 ,
certificateIntent ));
tabHost .addTab( this .buildTagSpec( "tab_more" , R.string. more ,
R.drawable. account05 , moreIntent ));
}
/**
* 自定义创建标签项的方法
* @param tagName 标签标识
* @param tagLable 标签文字
* @param icon 标签图标
* @param content 标签对应的内容
* @return
*/
private TabHost.TabSpec buildTagSpec(String tagName, int tagLable,
int icon, Intent content) {
return tabHost
.newTabSpec(tagName)
.setIndicator(getResources().getString(tagLable),
getResources().getDrawable(icon)).setContent(content);
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radio_button_study :
tabHost.setCurrentTabByTag("tab_study");
break ;
case R.id.radio_button_score :
tabHost.setCurrentTabByTag("tab_score");
break ;
case R.id.radio_button_certificate :
tabHost.setCurrentTabByTag("tab_certificate");
break ;
case R.id.radio_button_fee :
tabHost.setCurrentTabByTag("tab_fee");
break ;
case R.id.radio_button_more :
tabHost.setCurrentTabByTag("tab_more");
break ;
}
}
}
tab.xml
<? xml version = "1.0" encoding = "UTF-8" ?>
< TabHost android:id = "@+id/my_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:id="@+id/tab_radiogroup"
android:background="@drawable/tabs_bg" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="center_vertical"
android:layout_gravity="bottom" android:orientation="horizontal" >
< RadioButton android:id = "@+id/radio_button_study"
android:layout_marginTop = "2.0dip" android:text = " 学习进度 "
android:drawableTop = "@drawable/account01" style = "@style/tab_button_bottom"
android:checked = "true" />
< RadioButton android:id = "@+id/radio_button_score"
android:layout_marginTop = "2.0dip" android:text = " 考试成绩 "
android:drawableTop = "@drawable/account02" style = "@style/tab_button_bottom" />
< RadioButton android:id = "@+id/radio_button_certificate"
android:layout_marginTop = "2.0dip" android:text = " 证书发放 "
android:drawableTop = "@drawable/account03" style = "@style/tab_button_bottom" />
< RadioButton android:id = "@+id/radio_button_fee"
android:layout_marginTop = "2.0dip" android:text = " 费用缴纳 "
android:drawableTop = "@drawable/account04" style = "@style/tab_button_bottom" />
< RadioButton android:id = "@+id/radio_button_more"
android:layout_marginTop = "2.0dip" android:text = " 更多 "
android:drawableTop = "@drawable/account05" style = "@style/tab_button_bottom" />
</ RadioGroup >
</ LinearLayout >
</ TabHost >
radio_button的背景XML图
<?xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/tabbar_home_f" />
<item android:state_enabled="true" android:drawable="@drawable/tabbar_home" />
</selector>
styles.xml
<? xml version = "1.0" encoding = "utf-8" ?>
< resources >
<!-- TabHost 标签按钮样式 -->
< style name = "tab_button_bottom" >
< item name = "android:textSize" > 12px </ 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 /tab_btn_bg </ item >
< item name = "android:layout_marginTop" > 2.0dip </ item >
< item name = "android:button" > @null </ item >
< item name = "android:paddingTop" > 6dip </ item >
< item name = "android:drawablePadding" > 4dip </ item >
< item name = "android:layout_width" > fill_parent </ item >
< item name = "android:layout_height" > wrap_content </ item >
< item name = "android:layout_weight" > 1.0 </ item >
< item name = "android:singleLine" > true </ item >
</ style >
<!-- 页面标题 LinearLayout 样式 -->
< style name = "activity_title_background" >
< item name = "android:background" > @drawable /title_background </ item >
< item name = "android:layout_width" > fill_parent </ item >
< item name = "android:layout_height" > wrap_content </ item >
< item name = "android:layout_alignParentTop" > true </ item >
< item name = "android:gravity" > center </ item >
</ style >
<!-- 界面标题 TextView 样式 -->
< style name = "activity_title_text" >
< item name = "android:textSize" > 14dip </ item >
< item name = "android:textColor" > @drawable /white </ item >
< item name = "android:layout_width" > wrap_content </ item >
< item name = "android:layout_height" > wrap_content </ item >
< item name = "android:gravity" > center </ item >
</ style >
</ resources >
运行结果如下图所示
程序重要部分:
1. 红色字体部分。
2. 布局文件 tab.xml, 可以看到该布局文件中将 TabWidget 隐藏 ( android:visibility="gone" ) 而以一个 RadioGroup 取而代之。
3. 为 RadioGroup 设置 OnCheckedChangeListener 监听,通过 onCheckedChanged 方法对各个 RadioButton 点击事件的处理完成标签切换。
其实我当初考虑过为什么要用 RadioButton 而不用普通的 Button 。后来通过自己做项目,发现使用 RadioGroup 有以下优点:
1. 另外就是布局上比较方便易懂,不用再去用 LinearLayout 等布局去包含 Button 。
2. 我们可以很方便的获得当前选中的标签,当然通过 TabHost 的 tabHost.getCurrentTabTag() 和 getCurrentTab() 也是可以的。
3. 设置监听很方便,只需要为 RadioGroup 设置监听就行了,程序中对应的代码是
((RadioGroup) findViewById(R.id.tab_radiogroup ))
.setOnCheckedChangeListener(this );
如果用 Button 的话我们需要为所有的 Button 一个一个去设置监听,相对来说比较麻烦。
4. 或许最重要的一点是因为 RadioButton 本身就支持图片和文字的上下布局,只需指定图片和文字是什么就可以了而不需要我们自己去实现这种布局。
< RadioButton android:id = "@+id/radio_button_more"
android:layout_marginTop = "2.0dip"
android:text=" 更多 "
android:drawableTop="@drawable/account05"
style = "@style/tab_button_bottom" />
发表评论
-
Android里的音量调节
2013-04-01 13:37 1363步骤1:或许系统音量 ... -
Android Camera 方法分析
2012-03-29 10:52 3529Android Camera源码分析 android通 ... -
MyCameraActivity
2012-03-29 10:10 727package cn.fn; import android. ... -
MyCameraActivity
2012-04-01 13:27 907package cn.fn; import android. ... -
android AutoCompleteTextView+ SQLite
2012-03-21 13:33 1136android AutoCompleteTextView+ S ... -
android 异步回调加载网络图片
2012-03-20 11:50 964在做应用的时候很多时候都会去从网络加载图片,而且还要做各种各样 ... -
ProgressBar+AsyncTask 实现界面数据异步加载
2012-03-20 10:09 1647ProgressBar+AsyncTask 实现界面数据异步 ... -
Android 网络图片异步加载实例
2012-03-20 10:04 1011Android 网络图片异步加载实例 ... -
解决java.lang.OutOfMemoryError
2012-03-19 15:53 1117解决java.lang.OutOfMemoryError ... -
android Text 删除线
2012-03-16 19:35 1197import android.app.Activit ... -
android Gallery 详解
2012-03-14 14:17 1547android Gallery 正文 ... -
Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask,Task,AsynTask等
2012-03-14 11:43 1471Android的线程使用来更新UI----Thread、Han ... -
AsyncTask的使用
2012-03-14 10:59 851AsyncTask的使用 ... -
Android控件开发之Gallery3D效果
2012-03-13 14:38 2970Android控件开发之Gal ... -
android GridView
2012-03-08 10:28 933主类 import android.app.Activi ... -
ListView异步加载图片是非常实用的方法
2012-03-08 10:09 986ListView异步加载图片是非常实用的方法,凡是是要通过网络 ... -
复制assets下的数据库到SD卡
2012-03-07 10:56 1256首先使用sqliteadDev(一个windows下图形化sq ... -
Android异步加载图像小结
2012-03-06 16:46 625Android异步加载图像小结 (1)由于an ... -
AutoCompleteTextView
2012-03-05 14:53 1455AutoCompleteTextView ... -
android 动态加载List
2012-03-05 11:11 1018main.xml <?xml ver ...
相关推荐
这种设计模式可以用于构建层次分明、复杂度较高的应用界面,但要注意,过多的嵌套可能会导致用户界面变得混乱,因此在实际应用中应谨慎使用。 在实际开发过程中,Android提供了其他替代方案,如FragmentTabHost和...
4. 子TabHost的创建和设置与主TabHost相似,只是它们的生命周期与主TabHost中的标签关联,当用户切换主TabHost的标签时,子TabHost也会相应地改变。 在"DoubleTabHost"这个示例中,我们可以看到如何实现这种嵌套...
在Android开发中,`TabHost`是一个非常重要的组件,它用于创建具有标签栏的界面,让用户可以通过不同的标签在多个视图之间切换。`TabHost`是Android提供的一个容器,可以容纳多个`TabWidget`(标签)和一个`...
在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签可以展示不同的内容或活动(Activity)。本教程将详细介绍如何使用TabHost,特别适合初学者和教学场景,例如构建一个模拟...
`MainActivity`类中会初始化TabHost和ViewPager,`MyPagerAdapter`类作为Adapter负责填充ViewPager的内容。每个Tab下的页面可能由`Fragment`实现,如`Page1Fragment`、`Page2Fragment`等,这些Fragment对应TabHost的...
- 创建TabHost实例:通常我们会在布局XML文件中定义一个TabHost,并在Java代码中通过`findViewById()`获取它。 - 添加Tab:使用`TabHost.addTab()`方法来添加新的Tab。这个方法需要传递四个参数:TabSpec(Tab的...
在Android开发中,TabHost是一个重要的组件,用于创建带有可切换标签的用户界面。这篇博客“TabHost两种实现方式”探讨了如何在Android应用中使用TabHost来构建多标签视图。下面我们将深入讨论这两种实现方式及其...
然而,在实际使用过程中,开发者经常会遇到一个问题:TabHost下方会出现一条不期望的白色线条。这个问题可能是由于布局设置不当或者主题样式覆盖不完整导致的。本文将详细介绍如何使用TabHost实现分页应用,并针对...
当用户点击不同的Tab时,TabHost会根据设置的Intent切换到相应的Activity或替换FrameLayout中的内容。 二、创建TabHost 首先,你需要在布局文件中添加TabHost,并为其设置ID为"@android:id/tabhost"。接着,在...
在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签页可以关联到不同的Activity或View。本示例是关于如何使用TabHost实现单例模式的小例子,旨在帮助开发者理解如何在TabHost...
当用户切换标签或滑动 `ViewPager` 时,此监听器会更新选中的标签。 4. **添加TabHost的标签**:将创建好的 `TabSpec` 添加到 `TabHost`,并调用 `TabHost.setup()` 初始化 `TabHost`。 5. **处理页面切换事件**:...
这个布局文件会被`Adapter`的`getView()`方法加载并填充数据。 为了将自定义`ListView`添加到`TabHost`的一个`Tab`中,你需要: 1. 创建一个新的Activity或Fragment来展示`ListView`,并在这个Activity或Fragment...
- `TabHost`中的`Activity`默认是以栈的形式管理,点击新选项卡会将当前`Activity`压入栈底,新的`Activity`位于栈顶。如果希望切换时不创建新的`Activity`实例,可以使用`SingleTop`启动模式。 - `TabHost`在...
在底部的TabHost中,我们会设置多个标签,每个标签对应一个不同的Activity或Fragment,用户可以通过点击这些标签在不同的内容之间切换。 然后,我们来讨论如何在底部TabHost中的某个Activity或Fragment内嵌套一个...
在`MyTabHost`这个项目中,你可能会看到一个完整的`TabHost`和`TabWidget`的示例实现,包括XML布局文件和对应的Activity代码。通过分析这个项目,你可以更深入地了解如何在实际应用中使用这些组件。
在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签页可以承载不同的活动(Activity)或视图。本Demo主要展示了如何在Android应用中使用TabHost来构建一个多标签的用户界面。...
但`TabPageIndicator`在某些老版本库中仍被使用),这是一个视图,可以模拟`TabHost`的外观,但它与`ViewPager`协作,当用户在`ViewPager`中滑动时,`TabPageIndicator`的标签也会相应更新。具体步骤如下: 1. 在...
在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个选项卡的用户界面,每个选项卡都可以展示不同的内容或活动(Activity)。TabHost结合TabWidget和FrameLayout工作,TabWidget用于显示选项卡,而...
在TabHost中,我们通常会设置一个TabSpec对象,用于定义每个选项卡的内容和显示的标签文字。 **ViewPager** 是Android Support Library中的组件,它提供了一个可以左右滑动查看多个页面的界面。ViewPager通常配合...
在实现嵌套TabHost时,我们通常会遇到以下步骤: 1. **创建主TabHost**:首先,你需要创建一个主TabHost,并为其添加若干个Tab。每个Tab可能关联一个Activity,该Activity内部又包含了一个子TabHost。 2. **创建子...