0x0 前言
幫同學幹活,於是就用到了tabhost ,然後今天學習了一天, 收穫了很多東西, 也被坑 了好多次。所以今天主要講一下tabhost和intent 一起的實現。
0x1 沒代碼說個xx
在說代碼前我覺得我還是先貼張圖吧,我看了N個CSDN博客還有其他雜七雜八的東西,給我第一感受還是先給個圖看看吧。。。
這裏我也簡化了, 所有tab頁面都只加了一個TextView ,實際上完全可以做成一個獨立的activity的樣子((╯’ - ‘)╯( ┻━┻) 本來就是個activity 好不好)。 然後在上兩張目錄圖吧
這裏說明一下, 一個是 java包下的activity, 一個是res/layout下的xml佈局文件,這裏我們總共要實現四個tab頁面,所以請準備好4個activity +1個 TabActivity , 還有4個activity 對應的佈局文件和Tabactivity。
0x2 上代碼
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/tabhost">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TabWidget
android:layout_alignParentBottom="true"
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TabWidget>
<FrameLayout
android:layout_above="@android:id/tabs
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:padding="5dp"
android:layout_height="fill_parent">
</FrameLayout>
</RelativeLayout>
</TabHost>
這個地方最要在意的是佈局的位置, 大多說的應用都喜歡在底部放tab按鈕, 所以這裏這麼寫就夠了。 有的人用LinearLayout , 也可以,具體的我這裏就不展開了,因爲類似的博文csdn上太多了,今天一天我就翻了n個, 其實一開始我的按鈕也是在top,但是我的AS裏明明顯示的是在底部啊, 難道as抽了,(╯`□′)╯”“┻━┻☆))>○<) 。 還有這裏裏面不需要加任何元素 , 在我看的幾乎所有博客中, 這裏都加了東西, 不是說不可以,只是我喜歡怎麼簡單怎麼來。
上面就是main.xml了。 剩下幾個xml自己實現就好, 懶的話像我一樣放個TextView 。
好接下來是最主要的java代碼
package cn.edu.hdu.amanager;
import android.app.LocalActivityManager;
import android.app.TabActivity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.TabHost;
import cn.edu.hdu.People.Person;
public class AMain extends TabActivity {
final String TAG = "AMain+++++++++++++++" ;
private Intent personmsg ;
private Intent reactivity ;
private Intent pushnotify ;
private Intent calendar ;
private TabHost tbhost ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注意點1
setContentView(R.layout.main);
tbhost=getTabHost();
//LayoutInflater.from(this).inflate(R.layout.main, tbhost.getTabContentView(), true);
calendar = new Intent(this,calendar.class) ;
personmsg = new Intent(this , PersonMsg.class) ;
//注意點2
tbhost.addTab(tbhost.newTabSpec("tab1").setIndicator("calendar66", null)
.setContent(calendar));
tbhost.addTab(tbhost.newTabSpec("tab2").setIndicator("Person666", null)
.setContent(personmsg));
reactivity= new Intent(this,Reactivity.class) ;
tbhost.addTab(tbhost.newTabSpec("tab2").setIndicator("Person666",null)
.setContent(reactivity));
pushnotify = new Intent(this ,Pushnotify.class) ;
tbhost.addTab(tbhost.newTabSpec("tab2").setIndicator("Person666",null)
.setContent(pushnotify));
tbhost.setCurrentTab(0);
tbhost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
}
});
}
}
上面的兩個注意點
注意點1 我這裏是繼承了 TabActivity, 所以只要gettabHost() 就好, 如果繼承Activity ,需要使用setup() ,但是AS自己報錯了,比較無語。 其實是setContentView 和 LayoutInflater , 從我看的博客裏, 有的用前者, 有的用或者, 還有兩個都用的,但是好像在LayoutInflater下 setContentView 是沒有用的, 具體的試了一下, app崩了。 然後就是,單個使用的時候, 用setContentView ,界面就像最開始的那一張 , 但是我用後者, 按鈕又跑到top去了, 上圖
具體的我也不清楚是怎麼回事,也許以後會懂。 第一次寫這裏會比較糾結,但是自己試一下就ok了。
- 第二點 就是 使用Intent , 然後用tb 進行綁定, 這裏要將intent 放到 setContent 裏。 後面null的地方是用來放圖片的,因爲暫時我還沒拿到圖,所以null了,
後面就是設置了一個監聽, 沒什麼好講的。
0x3 總結+吐槽
1首先 吐槽一下AS, 自動生成了一個TabHost , 但是Id 爲什麼設置成了tabHost ,運行一下報錯了, 仔細查了一下才發現是系統沒有把tabHost 寫成tabhost , 害的我找了半天的bug. 所以自己一定要看清楚 那幾個特定的id 對不對。
2 從上面的代碼來看, tabActivity上的東西就相對來說比較少了, 而且也很清晰, 之前看的RadioButton,我是在看不下去了,太亂了,當然他也有他的好處。只是我喜歡簡單,而且你會發現你要處理的東西只要到對應的類裏去處理就ok了,等項目大了, 這種佈局的 優勢就會體現出來了。
今天看到了一個水平滑行的佈局, 好像HorizontaScrollView, 感覺可以試一下那個,大概就是下面tab, 上面再用這個容器。 然後還有一個ViewPage+FrameLayout 的吧, 感覺那個更加適合現在app, 所以大家有空可以去學下,如果可能我會發一篇這個的文章。
end暫時想到就這些, 以後再補充吧。代碼暫時還不能共享, 如果有需要,可以在文章下評論,留郵箱,我看到就發。