FragmentTabHost的基本用法

来源:http://www.cnblogs.com/ruichenblogs/archive/2016/02/16/5192348.html
-Advertisement-
Play Games

開通博客以來已經約莫1個月了。幾次想提筆寫寫東西,但總是由於各種各樣的原因並沒有開始。現在,年假剛結束,項目也還沒有開始,但最終促使我寫這篇博客的是,看了一篇博友寫的新年計劃,說是要在新的一年中寫50篇博客,我也心血來潮的定下了這樣的目標。把年前項目中用到的FragmentTabHost在這裡總結一


  開通博客以來已經約莫1個月了。幾次想提筆寫寫東西,但總是由於各種各樣的原因並沒有開始。現在,年假剛結束,項目也還沒有開始,但最終促使我寫這篇博客的是,看了一篇博友寫的新年計劃,說是要在新的一年中寫50篇博客,我也心血來潮的定下了這樣的目標。把年前項目中用到的FragmentTabHost在這裡總結一下。

  現在市面上app的主流框架大體分為兩種:一種是在主界面點擊菜單按鈕,之後會滑出側滑菜單,之後進入到各個模塊,還有一種是在主界面的下麵放置若幹個tab按鈕,點擊按鈕,切換到不同的模塊。今天要講的就是第二種的實現方式之一的FragmentTabHost.

  FragmentTabHost來自於android.support.v4.app這個包下,繼承自TabHost

作為android4.0的控制項,最近在做百度地圖的poi,發現sample中的v4包中竟然沒有FragmentTabHost這個類,汗!

好了,廢話還是少說為妙。

下麵是主界面的佈局文件

<RelativeLayout 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"
    tools:context="com.itrui.searchs.MainActivity" >
    

    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            >
            <FrameLayout 
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
            </FrameLayout>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:background="#D0D0D0">
            </TextView>
            <TabWidget 
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="#FFFFFF"
                android:layout_gravity="bottom"
                android:padding="10dp"
                ></TabWidget>
        </LinearLayout>
    </android.support.v4.app.FragmentTabHost>

</RelativeLayout>

控制項的命名是固定的不能隨便更改。控制項的id必須是Android提供的標準id, 即"@android:id"


Tab的佈局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >
    <LinearLayout
        android:id="@+id/layout_ancor" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="2dp"
        android:paddingBottom="15dp"
        android:paddingTop="10dp">
    <ImageView 
        android:id="@+id/img_tab_pic"
        android:layout_width="32dp"
        android:layout_height="32dp"
        />
    </LinearLayout>
   
</RelativeLayout>View Code

此佈局文件是一張圖片,當然你也可以根據自己的需求來添加其他的控制項,比如文字之類的控制項

其中之一的Fragment的佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <RelativeLayout 
        android:id="@+id/fragment_main_frist_title"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        >
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="10dp"
            android:layout_marginLeft="80dp"
            android:text="poi搜索"/>
        <ImageView 
            android:id="@+id/iv_baidu_dingwei"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:paddingTop="10dp"
            android:paddingRight="5dp"
            android:layout_alignParentRight="true"
            android:src="@drawable/baidumap"/>
    </RelativeLayout>
    <TextView 
        
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="我是主界面的第一個fragment"/>
    

</LinearLayout>

當然你也可以同一個fragment實現復用。

主頁面的代碼:

public class MainActivity extends FragmentActivity {

    private FragmentTabHost myTabhost;
    //Tab圖片
    private int mImages[] = {
            R.drawable.tab_assistant_gray,R.drawable.tab_center_gray,R.drawable.tab_contest_gray,R.drawable.tab_counter_gray
    };
    //標記
private String mFragmentTags[] ={ "第一個","第二個","第三個","第四個" }; //載入的Fragment private Class mFragment[] ={ MainFristFragment.class,MainSecondFragment.class,MainThridFragment.class,MainFristFragment.class }; @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initTabHost(); } private void initTabHost() { myTabhost = (FragmentTabHost) findViewById(android.R.id.tabhost); myTabhost.setup(this, getSupportFragmentManager(),android.R.id.tabhost); //去掉分割線 myTabhost.getTabWidget().setDividerDrawable(null); for(int i = 0;i<mImages.length;i++){ //對Tab按鈕添加標記和圖片 TabSpec tabSpec = myTabhost.newTabSpec(mFragmentTags[i]).setIndicator(getImageView(i)); //添加Fragment myTabhost.addTab(tabSpec,mFragment[i],null); myTabhost.getTabWidget().getChildAt(i).setBackgroundResource(R.color.white); } } //獲取圖片資源 private View getImageView(int index){ View view = getLayoutInflater().inflate(R.layout.tab_title, null); ImageView imageView = (ImageView) view.findViewById(R.id.img_tab_pic); imageView.setImageResource(mImages[index]); return view; } }

在onCreat()中執行 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);語句的作用是讓手機屏幕保持一種不暗不關閉的效果。通常的應用場景是視頻播放器。
總結:

在FragmentTabHost這一個佈局中包裹著FrameLayout(也可以換成其他佈局主要作用是存放fragment)和TabWidget控制項。

執行語句:

myTabhost.setup(this, getSupportFragmentManager(),android.R.id.tabhost);

去掉分割線

myTabhost.getTabWidget().setDividerDrawable(null);

向FragmentTabHost中添加標識和添加圖標

TabSpec tabSpec = myTabhost.newTabSpec(mFragmentTags[i]).setIndicator(getImageView(i));

將對應的fragment添加到控制項中去

myTabhost.addTab(tabSpec,mFragment[i],null);

其實還是蠻好用的一個控制項。

 

 

 

 

 

 

 

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言:有時候我們需要獲取文件的MIMEType的信息,下麵就介紹關於獲取MIMEType的方法。 1、直接百度搜索關鍵字"MIMEType",你會找到,然後查吧: 2、用代碼獲取文件的MIMEType信息: 1 #import "GetMIMEType.h" 2 3 #import <MobileC
  • 前言:使用NSURLConnection實現文件上傳有點繁瑣。 本文並沒有介紹使用第三方框架上傳文件。 正文: 這裡先提供用於編碼測試的介面:http://120.25.226.186:32812 點擊進去你會發現到下麵: 最好該鏈接用Google瀏覽器打開,因為Google瀏覽器開啟開發者模式用起
  • Android開發,需要連接webservice,之前就想用谷歌提供的jar包,下載地址:http://pan.baidu.com/s/1hqMTUHe 把它下載下來粘貼到libs文件夾下即可: 網上有很多類似的方法,我嘗試了很多都沒有成功,最後發現是我下載的jar包有問題導致我一直卡在哪兒。 首先
  • 如下是快速索引的效果圖,是從網上下的實例。如圖實現的難點1:是最右側的索引是用自定義View來實現的,主要通過onDraw的方法將其畫出; 難點2:是如何拿到每個名字的首字母用的是pinyin4j-2.5.0.jar 將漢字轉化成拼音再去第一個字元;難點3:ListView的adapte不好實現 下
  • Android的存儲系統(一) 看了很長時間Vold存儲模塊的相關知識,也死扣了一段時間的Android源碼,發現Android存儲系統所涉及的函數調用,以及Kernel與上層之間的Socket傳輸真的是讓人頭疼,除了需要整理整個架構的原理以外,還要反覆看源碼,真真的鬱悶。 鬱悶之餘,還是打算把自己
  • 1.ERROR:--90096 :原因是:啟動圖的問題; 解決 :添加一張名字是 [email protected] 的啟動圖; 2.ERROR:--90535 :原因是:導入的第三方的問題; 解決 :刪除第三方包中的info.plist里的Executable file 這一行;
  • 在開發過程中,經常會需要處理一組不同類型的數據,比如學生的個人信息,由姓名、年齡、性別、身高等組成,因為這些數據是由不同數據類型組成的,因此不能用數組表示,對於不同數據類型的一組數據,可以採用結構體來進行存儲。當然,對於面向對象的語言來說,最好是用類來表示,但是C語言是面向過程的,因此選擇用結構體來
  • 在開始前我們在這先附一段最簡單的代碼 - (void)viewDidLoad { [super viewDidLoad]; UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; UICollec
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...