標籤:android 介面 ui 新浪微博
如今Android上很多應用都採用底部菜單控制更新的UI這種架構,例如新浪微博
點擊底部菜單的選項可以更新介面。底部菜單可以使用TabHost來實現,不過用過TabHost的人都知道自訂TabHost究竟是有多麻煩的,原生TabHost的風格是不依附螢幕的底部的,要依附底部就要重寫布局。
TabHost設定的Container可以管理UI的顯示,UI可以用LayoutInflater動態產生,也可以是Activity,但不好管理Activity的生命週期。然後用TabHost控制顯示UI的顯示。
下面使用的一種方法是自訂菜單布局+ActivityGroup+多個Activity的方式實現,下面是Demo的:
ActivityGroup
ActivityGroup,顧名思義就是Activity組,可以管理多個Activity的啟動和銷毀。ActivityGroup是繼承Activity的,但是這個方法目前已經被棄用了,雖然不推薦使用,不過還是可以用的。以後會講推薦的做法。我們會用這個類管理介面的實現。ActivityGroup中有一個重要的方法是getLocalActivityManager,這個方法可以銷毀和啟動新的Activity,並可以通過getDecorView方法擷取到啟動Activity的根視圖顯示出來。Activity顯示在ActivityGroup中的一個container中,而container是顯示Activity的一個地區,這個container必須是ViewGroup或者是其子類。
首先編寫一個TabActivity
package com.shamoo.activity;import android.app.ActivityGroup;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.view.Window;public class TabActivity extends ActivityGroup {private ViewGroup container;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);}/** * 通過id設定Activity顯示的container,該container必須是繼承ViewGroup的 */protected void setContainer(int resId) {container = (ViewGroup) findViewById(resId);}/** * 通過Activity的class顯示Activity */protected void showActivity(Class<?> activityClass) {Intent intent = new Intent(this, activityClass);// 檢查container是否有顯示的Activity,如果有,先移除View activity = container.getChildAt(0);if (activity != null) {// 移除顯示的activity的Viewcontainer.removeAllViews();// 通過ActivityManager移除activitygetLocalActivityManager().removeAllActivities();}// 啟動新的activity,並將該activity的根視圖添加到contanier中container.addView(getLocalActivityManager().startActivity(activityClass.getName(), intent).getDecorView());}}
編寫一個繼承TabActivity的MainActivity管理介面,介面是三個Activity
package com.shamoo.activity;import com.shamoo.activitygroupdemo.R;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends TabActivity implements OnClickListener {/** * 顯示的三個Activity的class */private Class<?> activities[] = {OneActivity.class, TwoActivity.class, ThreeActivity.class};/** * 菜單的三個按鈕 */private Button[] btn = new Button[3];/** * 當前的選擇 */private int currentSelect;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsetContentView(R.layout.activity_main);setContainer(R.id.fl_container);btn[0] = (Button) findViewById(R.id.btn_one);btn[0].setOnClickListener(this);btn[1] = (Button) findViewById(R.id.btn_two);btn[1].setOnClickListener(this);btn[2] = (Button) findViewById(R.id.btn_three);btn[2].setOnClickListener(this);showActivity(activities[0]);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbtn[currentSelect].setBackgroundResource(R.color.normal);switch (v.getId()) {case R.id.btn_one:currentSelect = 0;btn[0].setBackgroundResource(R.color.select);showActivity(activities[0]);break;case R.id.btn_two:currentSelect = 1;btn[1].setBackgroundResource(R.color.select);showActivity(activities[1]);break;case R.id.btn_three:currentSelect = 2;btn[2].setBackgroundResource(R.color.select);showActivity(activities[2]);break;}}}
編寫activity_main.xml,該布局有底部菜單的實現,是通過LinearLayout的layout_weight配合修改背景的Button實現的
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/rl_menu" android:layout_width="match_parent" android:layout_height="45dp" android:layout_alignParentBottom="true" android:orientation="horizontal" > <Button android:id="@+id/btn_one" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#008eff" android:text="1" /> <Button android:id="@+id/btn_two" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#555555" android:text="2" /> <Button android:id="@+id/btn_three" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#555555" android:text="3" /> </LinearLayout> <FrameLayout android:id="@+id/fl_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/rl_menu" > </FrameLayout></RelativeLayout>
然後編寫三個Activity,這三個Activity可以自訂。代碼比較多,就不全貼出來了。
啟動Demo之後,可以看到Activity的生命週期管理是沒有問題的
Demo下載連結:http://download.csdn.net/detail/stephenzcl/7306531