前言
最近學習Android開發,公司馬上要有Android項目開發,突感壓力山大。接到上級命令,做個類似新浪微博的界面出來,只好加緊學習,蒐集資料,終於不負聖恩,按時完成。由此促成這篇文章的誕生,廢話不多說,上正文.......
AndroidManifest.xml
簡介
Android程序的主入口,類似於J2EE項目中的web.xml,定義了程序的內容和行爲。
代碼
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.duanyr.sinaweibotabhost"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- Android程序主入口,調用MainActivity -->
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 註冊項目用到的多個Activity -->
<activity android:name=".HomeActivity" />
<activity android:name=".MessageActivity" />
<activity android:name=".InfoActivity" />
</application>
</manifest>
由上述配置文件可以看出,程序的主入口爲MainActivity.java,接下來看MainActivity.java的內容。
MainActivity.java
package com.duanyr.sinaweibotabhost;
import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RadioButton;
import android.widget.TabHost;
/**
* @author: duanyr
* @創建時間: 2012-11-12 下午4:02:00
*
* 類說明:仿新浪微博底部TabHost實現
*/
public class MainActivity extends TabActivity implements
OnCheckedChangeListener {
private TabHost tabHost;
private Intent homeIntent;
private Intent messageIntent;
private Intent infoIntent;
/**
* 重寫Activity的onCreate方法
* 該方法當程序啓動時,切換橫豎屏時,再次啓動時運行
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//不顯示title
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// ~~~~~~~~~~~~ 初始化~~~~~~~~~~//
this.homeIntent = new Intent(this, HomeActivity.class);
this.messageIntent = new Intent(this, MessageActivity.class);
this.infoIntent = new Intent(this, InfoActivity.class);
initRadios();//初始化底部按鈕
setupIntent();//綁定選項卡數據
}
/**
* 初始化底部按鈕
*/
private void initRadios() {
((RadioButton) findViewById(R.id.radio_btn_home))
.setOnCheckedChangeListener(this);
((RadioButton) findViewById(R.id.radio_btn_message))
.setOnCheckedChangeListener(this);
((RadioButton) findViewById(R.id.radio_btn_info))
.setOnCheckedChangeListener(this);
}
/**
* 底部按鈕改變是調用的方法
*/
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
switch (buttonView.getId()) {
case R.id.radio_btn_home:
this.tabHost.setCurrentTabByTag("home_tab");
break;
case R.id.radio_btn_message:
this.tabHost.setCurrentTabByTag("message_tab");
break;
case R.id.radio_btn_info:
this.tabHost.setCurrentTabByTag("info_tab");
break;
}
}
}
/**
* 綁定各個選項卡數據內容
*/
private void setupIntent() {
this.tabHost = getTabHost();
TabHost localTabHost = this.tabHost;
localTabHost.addTab(buildTabSpec("home_tab", R.string.main_home,
R.drawable.icon_home, this.homeIntent));
localTabHost.addTab(buildTabSpec("message_tab", R.string.main_message,
R.drawable.icon_message, this.messageIntent));
localTabHost.addTab(buildTabSpec("info_tab", R.string.main_info,
R.drawable.icon_info, this.infoIntent));
}
private TabHost.TabSpec buildTabSpec(String tag, int resLabel, int resIcon,
final Intent content) {
return this.tabHost
.newTabSpec(tag)
.setIndicator(getString(resLabel),
getResources().getDrawable(resIcon))
.setContent(content);
}
}
由上述文件可以看出,其加載的視圖爲activity_main.xml,接下來看activity_main.xml。
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<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:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.0"
android:visibility="gone" />
<RadioGroup
android:id="@+id/main_radio"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@drawable/maintab_bg"
android:gravity="center_vertical"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/radio_btn_home"
style="@style/main_tab_bottom"
android:layout_marginTop="2.0dip"
android:checked="true"
android:drawableTop="@drawable/icon_home"
android:text="@string/main_home" />
<RadioButton
android:id="@+id/radio_btn_message"
style="@style/main_tab_bottom"
android:layout_marginTop="2.0dip"
android:drawableTop="@drawable/icon_message"
android:text="@string/main_message" />
<RadioButton
android:id="@+id/radio_btn_info"
style="@style/main_tab_bottom"
android:layout_marginTop="2.0dip"
android:drawableTop="@drawable/icon_info"
android:text="@string/main_info" />
</RadioGroup>
</LinearLayout>
</TabHost>
由上述xml文件可以看出,此底部菜單是有一個單選按鈕組來完成的,其中包括三個單選按鈕,分別爲home(主頁)、message(消息)、info(個人信息),結合MainActivity.java可以知道當改變單選按鈕時,會顯示不同的視圖。以message爲例,MessageActivity.java如下
MessageActivity.java
package com.duanyr.sinaweibotabhost;
import android.app.Activity;
import android.os.Bundle;
public class MessageActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
}
}
activity_message.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/my_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_message" />
</LinearLayout>
以上爲Message(信息)對應的Activity和XML文件,其他兩個也於此一樣,就不在一一列舉了,接下來是項目中的資源文件:String.xml和styles.xml
String.xml
<resources>
<string name="app_name">SinaWeiboTabHost</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="main_home">主頁</string>
<string name="main_message">消息</string>
<string name="main_info">個人資料</string>
</resources>
Styles.xml
<resources>
<style name="AppTheme" parent="android:Theme.Light" />
<style name="main_tab_bottom">
<item name="android:textSize">10.0dip</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">5.0dip</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">2.0dip</item>
<item name="android:layout_weight">1.0</item>
</style>
</resources>
還有部分圖片資源不方便上傳,具體項目已經上傳到資源庫中,地址爲:http://download.csdn.net/detail/duanyanrui/4759463,歡迎大家下載。此代碼有借鑑網友的代碼資料,在此謝謝各位網友的不吝賜教,項目有不當之處還請大家多多指教。