现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用tabhost组件来自定义一个底部的导航栏的功能。
我们先看下该demo实例的框架图:
其中各个类的作用以及资源文件就不详细解释了,还有资源图片(在该demo中借用了其它应用程序的资源图片)也不提供了,大家可以自行更换自己需要的资源图片。直接上各个布局文件或各个类的代码:
1、 res/layout目录下的 maintabs.xml 源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?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:id= "@id/radio_button0" android:layout_margintop= "2.0dip" android:text= "@string/main_home" 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_manage_date" 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/main_friends" 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>
|
2、res/drawable 下的 home_btn_bg.xml 源码:
1
2
3
4
5
6
7
|
<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>
|
3、res/values 下的源码:
dimens.xml源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?xml version= "1.0" encoding= "utf-8" ?>
<resources>
<dimen name= "bottom_tab_font_size" > 10 .0sp</dimen>
<dimen name= "bottom_tab_padding_up" > 5 .0dip</dimen>
<dimen name= "bottom_tab_padding_drawable" > 2 .0dip</dimen>
<dimen name= "switch_logo_bottom_padding" > 30 .0sp</dimen>
<dimen name= "widget_height" > 100 .0dip</dimen>
<dimen name= "sta_height" > 48 .0dip</dimen>
<dimen name= "large_padding_length" > 20 .0dip</dimen>
<dimen name= "widget_write_margin_top" > 19 .0dip</dimen>
<dimen name= "widget_write_margin_left" > 10 .0dip</dimen>
<dimen name= "widget_content_margin_top" > 20 .0dip</dimen>
<dimen name= "widget_content_margin_left" > 10 .0dip</dimen>
<dimen name= "widget_logo_size" > 35 .0dip</dimen>
<dimen name= "title_height" > 74 .0dip</dimen>
<dimen name= "new_blog_size" > 70 .0dip</dimen>
<dimen name= "emotion_item_view_height" > 13 .299988dip</dimen>
<dimen name= "splash_test_top_margin_top" > 20 .0dip</dimen>
<dimen name= "splash_test_center_margin_right" > 0 .0dip</dimen>
<dimen name= "title_text_size" > 20 .0sp</dimen>
<dimen name= "normal_padding_length" > 10 .0dip</dimen>
<dimen name= "no_result_padding_length" > 50 .0dip</dimen>
</resources>
|
drawables.xml源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version= "1.0" encoding= "utf-8" ?>
<resources>
<item type= "drawable" name= "ltgray" >#fff4f4f4</item>
<item type= "drawable" name= "ltyellow" >#fffff4db</item>
<item type= "drawable" name= "black" >#ff000000</item>
<item type= "drawable" name= "transparent" ># 00000000 </item>
<item type= "drawable" name= "widget_edit_block_bg_normal" > @android :color/transparent</item>
<item type= "drawable" name= "transparent_background" ># 99000000 </item>
<item type= "drawable" name= "list_background" >#fff4f4f4</item>
<item type= "drawable" name= "namcard_picker_bkg_normal" >#ff272727</item>
<item type= "drawable" name= "namcard_picker_bkg_hover" >#ff333333</item>
</resources>
|
ids.xml源码:
1
2
3
4
5
6
7
8
9
10
11
|
<?xml version= "1.0" encoding= "utf-8" ?>
<resources>
<item type= "id" name= "main_radio" > false </item>
<item type= "id" name= "radio_button0" > false </item>
<item type= "id" name= "radio_button1" > false </item>
<item type= "id" name= "radio_button2" > false </item>
<item type= "id" name= "radio_button3" > false </item>
<item type= "id" name= "radio_button4" > false </item>
</resources>
|
strings.xml源码:
1
2
3
4
5
6
7
8
9
10
|
<?xml version= "1.0" encoding= "utf-8" ?>
<resources>
<string name= "hello" >hello world, maintabactivity!</string>
<string name= "app_name" >tabdemo</string>
<string name= "main_news" >消息</string>
<string name= "main_home" >首页</string>
<string name= "more" >更多</string>
<string name= "main_manage_date" >时间</string>
<string name= "main_friends" >好友</string>
</resources>
|
styles.xml源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?xml version= "1.0" encoding= "utf-8" ?>
<resources>
<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:paddingbottom" > 2 .0dip</item>
<item name= "android:layout_width" >fill_parent</item>
<item name= "android:layout_height" >wrap_content</item>
<item name= "android:layout_marginbottom" > 2 .0dip</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>
</resources>
|
4、 src/com.andyidea.tabdemo包下面各个ui界面类源码:
maintabactivity.java源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
package com.andyidea.tabdemo;
import android.app.tabactivity;
import android.content.intent;
import android.os.bundle;
import android.view.window;
import android.widget.compoundbutton;
import android.widget.radiobutton;
import android.widget.compoundbutton.oncheckedchangelistener;
import android.widget.tabhost;
public class maintabactivity extends tabactivity implements oncheckedchangelistener{
private tabhost mtabhost;
private intent maintent;
private intent mbintent;
private intent mcintent;
private intent mdintent;
private intent meintent;
/** called when the activity is first created. */
@override
public void oncreate(bundle savedinstancestate) {
super .oncreate(savedinstancestate);
requestwindowfeature(window.feature_no_title);
setcontentview(r.layout.maintabs);
this .maintent = new intent( this ,aactivity. class );
this .mbintent = new intent( this ,bactivity. class );
this .mcintent = new intent( this ,cactivity. class );
this .mdintent = new intent( this ,dactivity. class );
this .meintent = new intent( this ,eactivity. class );
((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 );
setupintent();
}
@override
public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) {
if (ischecked){
switch (buttonview.getid()) {
case r.id.radio_button0:
this .mtabhost.setcurrenttabbytag( "a_tab" );
break ;
case r.id.radio_button1:
this .mtabhost.setcurrenttabbytag( "b_tab" );
break ;
case r.id.radio_button2:
this .mtabhost.setcurrenttabbytag( "c_tab" );
break ;
case r.id.radio_button3:
this .mtabhost.setcurrenttabbytag( "d_tab" );
break ;
case r.id.radio_button4:
this .mtabhost.setcurrenttabbytag( "more_tab" );
break ;
}
}
}
private void setupintent() {
this .mtabhost = gettabhost();
tabhost localtabhost = this .mtabhost;
localtabhost.addtab(buildtabspec( "a_tab" , r.string.main_home,
r.drawable.icon_1_n, this .maintent));
localtabhost.addtab(buildtabspec( "b_tab" , r.string.main_news,
r.drawable.icon_2_n, this .mbintent));
localtabhost.addtab(buildtabspec( "c_tab" ,
r.string.main_manage_date, r.drawable.icon_3_n,
this .mcintent));
localtabhost.addtab(buildtabspec( "d_tab" , r.string.main_friends,
r.drawable.icon_4_n, this .mdintent));
localtabhost.addtab(buildtabspec( "more_tab" , r.string.more,
r.drawable.icon_5_n, this .meintent));
}
private tabhost.tabspec buildtabspec(string tag, int reslabel, int resicon,
final intent content) {
return this .mtabhost.newtabspec(tag).setindicator(getstring(reslabel),
getresources().getdrawable(resicon)).setcontent(content);
}
}
|
其中 aactivity.java 与 bactivity.java ,cactivity.java ,dactivity.java ,eactivity.java 中的源码都一样,只是用来表示不同的界面展示,故这里只列出 aactivity.java的源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package com.andyidea.tabdemo;
import android.app.activity;
import android.os.bundle;
import android.view.gravity;
import android.widget.textview;
public class aactivity extends activity{
@override
public void oncreate(bundle savedinstancestate) {
super .oncreate(savedinstancestate);
textview tv = new textview( this );
tv.settext( "this is a activity!" );
tv.setgravity(gravity.center);
setcontentview(tv);
}
}
|
最后,大家别忘了在 androidmanifest.xml 文件中注册各个 activity 组件哦。好了,现在我们看下我们程序运行的效果图:
源码下载: android实现底部导航栏功能(选项卡)
到此就实现了一个比较流行的底部导航栏的功能了,希望本文所述对大家学习android软件编程有所帮助。