Android自訂TabActivity(實現仿新浪微博底部菜單更新UI)

來源:互聯網
上載者:User

標籤: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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.