TabHost与RadioGroup结合完成的菜单

效果图:
 

首先看布局文件:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
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
"1.0" encoding= "UTF-8" ?>
"@android:id/tabhost" android:layout_width= "fill_parent" android:layout_height= "fill_parent"
xmlns:android= "http://schemas.android.com/apk/res/android" >
android:orientation= "vertical"
android:layout_width= "fill_parent"
android:layout_height= "fill_parent" >
android:id= "@android:id/tabcontent"
android:layout_width= "fill_parent"
android:layout_height= "0.0dip"
android:layout_weight= "1.0" />
android:id= "@android:id/tabs"
android:visibility= "gone"
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android:layout_weight= "0.0" />
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" >
android:id= "@+id/radio_button0"
android:tag= "radio_button0"
android:layout_marginTop= "2.0dip"
android:text= "@string/alarm"
android:drawableTop= "@drawable/icon_1"
style= "@style/main_tab_bottom" />
android:id= "@+id/radio_button1"
android:tag= "radio_button1"
android:layout_marginTop= "2.0dip"
android:text= "@string/message"
android:drawableTop= "@drawable/icon_2"
style= "@style/main_tab_bottom" />
android:id= "@+id/radio_button2"
android:tag= "radio_button2"
android:layout_marginTop= "2.0dip"
android:text= "@string/photo"
android:drawableTop= "@drawable/icon_3"
style= "@style/main_tab_bottom" />
android:id= "@+id/radio_button3"
android:tag= "radio_button3"
android:layout_marginTop= "2.0dip"
android:text= "@string/music"
android:drawableTop= "@drawable/icon_4"
style= "@style/main_tab_bottom" />
android:id= "@+id/radio_button4"
android:tag= "radio_button4"
android:layout_marginTop= "2.0dip"
android:text= "@string/setting"
android:drawableTop= "@drawable/icon_5"
style= "@style/main_tab_bottom" />


需要注意的是,如果用TabHost这个控件,其中有几个ID是必须这么写的,android:id="@android:id/tabhost   ;android:id="@android:id/tabcontent" ;android:id="@android:id/tabs" ;之所以要这么写是因为在TabHost这个类中。需要实例化上述这个ID的控件。看源码: 

在TabActivity中有么个方法: 

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@Override
public void onContentChanged() {
super .onContentChanged();
mTabHost = (TabHost) findViewById(com.android.internal.R.id.tabhost);
 
if (mTabHost == null ) {
throw new RuntimeException(
"Your content must have a TabHost whose id attribute is " +
"'android.R.id.tabhost'" );
}
mTabHost.setup(getLocalActivityManager());
}
 
private void ensureTabHost() {
if (mTabHost == null ) {
this .setContentView(com.android.internal.R.layout.tab_content);
}
}


当内容发生改变时它会调用这个方法,来更新列表或者其他视图,而这个方法中需要实例化TabHost,所以必须通过ID为tabhost实例化。 

再看看TabHost这个类中,

代码片段,双击复制
01
02
03
04
05
06
07
08
09
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
public void setup() {
mTabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs);
if (mTabWidget == null ) {
throw new RuntimeException(
"Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'" );
}
 
// KeyListener to attach to all tabs. Detects non-navigation keys
// and relays them to the tab content.
mTabKeyListener = new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_ENTER:
return false ;
 
}
mTabContent.requestFocus(View.FOCUS_FORWARD);
return mTabContent.dispatchKeyEvent(event);
}
 
};
 
mTabWidget.setTabSelectionListener( new TabWidget.OnTabSelectionChanged() {
public void onTabSelectionChanged( int tabIndex, boolean clicked) {
setCurrentTab(tabIndex);
if (clicked) {
mTabContent.requestFocus(View.FOCUS_FORWARD);
}
}
});
 
mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);
if (mTabContent == null ) {
throw new RuntimeException(
"Your TabHost must have a FrameLayout whose id attribute is "
+ "'android.R.id.tabcontent'" );
}
}


这个方法,是在增加选项卡之前由系统调用。在这个方法中需要通过tabs 这个ID实例化一个TabWidget,通过tabcontent这个ID实例化一个FrameLayout,用来放置选项卡内容。所以这两个ID也是固定的。 

在上述布局文件中隐藏了系统默认的Widget,取而代之的是带有图片的Button。 

看一下主要代码: 

代码片段,双击复制
01
02
03
04
05
06
07
08
09
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
package com.iteye.androidtoast;
 
import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TabHost;
 
public class MainActivity extends TabActivity implements OnCheckedChangeListener{
/** Called when the activity is first created. */
private TabHost mHost;
private RadioGroup radioderGroup;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.maintabs);
//实例化TabHost
mHost= this .getTabHost();
 
//添加选项卡
mHost.addTab(mHost.newTabSpec( "ONE" ).setIndicator( "ONE" )
.setContent( new Intent( this ,OneActivity. class )));
mHost.addTab(mHost.newTabSpec( "TWO" ).setIndicator( "TWO" )
.setContent( new Intent( this ,TwoActivity. class )));
mHost.addTab(mHost.newTabSpec( "THREE" ).setIndicator( "THREE" )
.setContent( new Intent( this ,ThreeActivity. class )));
mHost.addTab(mHost.newTabSpec( "FOUR" ).setIndicator( "FOUR" )
.setContent( new Intent( this ,FourActivity. class )));
mHost.addTab(mHost.newTabSpec( "FIVE" ).setIndicator( "FIVE" )
.setContent( new Intent( this ,FiveActivity. class )));
 
radioderGroup = (RadioGroup) findViewById(R.id.main_radio);
radioderGroup.setOnCheckedChangeListener( this );
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.radio_button0:
mHost.setCurrentTabByTag( "ONE" );
break ;
case R.id.radio_button1:
mHost.setCurrentTabByTag( "TWO" );
break ;
case R.id.radio_button2:
mHost.setCurrentTabByTag( "THREE" );
break ;
case R.id.radio_button3:
mHost.setCurrentTabByTag( "FOUR" );
break ;
case R.id.radio_button4:
mHost.setCurrentTabByTag( "FIVE" );
break ;
}
}
}



文章地址:http://www.eoeandroid.com/thread-177354-1-1.html

你可能感兴趣的:(Android常用知识)