Android ViewPager+TabHost實現首頁導航

来源:http://www.cnblogs.com/upwgh/archive/2016/09/21/5892462.html
-Advertisement-
Play Games

今天發的是TabHost結合ViewPager實現首頁底部導航的效果,雖然說網上有很多這樣的Demo,不過呢,我還是要把自己練習寫的發出來,沒錯!就是這麼任性; 先上效果圖,如下: 代碼裡面有註釋,就不過多解釋了,說幾點需要註意的問題 1:TabHost 、TabWidget、FrameLayout ...


今天發的是TabHost結合ViewPager實現首頁底部導航的效果,雖然說網上有很多這樣的Demo,不過呢,我還是要把自己練習寫的發出來,沒錯!就是這麼任性;
先上效果圖,如下:

代碼裡面有註釋,就不過多解釋了,說幾點需要註意的問題
1:TabHost 、TabWidget、FrameLayout一定添加id這個屬性,否則會報錯
android:id=”@android:id/tabhost”
android:id=”@android:id/tabcontent”
android:id=”@android:id/tabs”
這個屬性是固定的。
2:ViewPager的適配器要繼承PagerAdapter,別整錯咯;
佈局文件xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:id="@android:id/tabhost"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     tools:context="com.example.wgh.tabhostwithviewpager.MainActivity">
 8 
 9     <LinearLayout
10         android:layout_width="match_parent"
11         android:layout_height="match_parent"
12         android:orientation="vertical">
13 
14         <FrameLayout
15             android:id="@android:id/tabcontent"
16             android:layout_width="match_parent"
17             android:layout_height="match_parent"
18             android:layout_weight="1.0">
19 
20             <android.support.v4.view.ViewPager
21                 android:id="@+id/viewPager"
22                 android:layout_width="match_parent"
23                 android:layout_height="match_parent"></android.support.v4.view.ViewPager>
24 
25         </FrameLayout>
26 
27         <TabWidget
28             android:id="@android:id/tabs"
29             android:layout_width="match_parent"
30             android:layout_height="match_parent"
31             android:layout_weight="0.0"
32             android:visibility="gone" />
33 
34         <View
35             android:layout_width="match_parent"
36             android:layout_height="1dp"
37             android:background="#0ff0f0" />
38 
39         <RadioGroup
40             android:id="@+id/radioGroup"
41             android:layout_width="match_parent"
42             android:layout_height="wrap_content"
43 
44             android:orientation="horizontal">
45 
46             <RadioButton
47                 android:id="@+id/radioButton1"
48                 android:layout_width="0dp"
49                 android:layout_height="wrap_content"
50                 android:layout_margin="5dp"
51                 android:layout_weight="1"
52                 android:background="@drawable/img_draw_money_fail"
53                 android:button="@null"
54                 android:paddingLeft="10dp" />
55 
56             <RadioButton
57                 android:id="@+id/radioButton2"
58                 android:layout_width="0dp"
59                 android:layout_height="wrap_content"
60                 android:layout_margin="5dp"
61                 android:layout_weight="1"
62                 android:background="@drawable/img_draw_money_fail"
63                 android:button="@null" />
64 
65             <RadioButton
66                 android:id="@+id/radioButton3"
67                 android:layout_width="0dp"
68                 android:layout_height="wrap_content"
69                 android:layout_margin="5dp"
70                 android:layout_weight="1"
71                 android:background="@drawable/img_draw_money_fail"
72                 android:button="@null" />
73 
74             <RadioButton
75                 android:id="@+id/radioButton4"
76                 android:layout_width="0dp"
77                 android:layout_height="wrap_content"
78                 android:layout_margin="5dp"
79                 android:layout_weight="1"
80                 android:background="@drawable/img_draw_money_fail"
81                 android:button="@null" />
82         </RadioGroup>
83     </LinearLayout>
84 </TabHost>

Activity:

  1 package com.example.wgh.tabhostwithviewpager;
  2 
  3 import android.app.TabActivity;
  4 import android.os.Bundle;
  5 import android.support.v4.view.ViewPager;
  6 import android.view.LayoutInflater;
  7 import android.view.View;
  8 import android.widget.RadioButton;
  9 import android.widget.RadioGroup;
 10 import android.widget.TabHost;
 11 
 12 import java.util.ArrayList;
 13 
 14 public class MainActivity extends TabActivity {
 15 
 16     private TabHost tabHost = null;
 17     private ViewPager viewPager = null;
 18     private RadioGroup radioGroup = null;
 19     private ArrayList<View> list = null;
 20     private View view1 = null;
 21     private View view2 = null;
 22     private View view3 = null;
 23     private View view4 = null;
 24     private RadioButton radioButton1 = null;
 25     private RadioButton radioButton2 = null;
 26     private RadioButton radioButton3 = null;
 27     private RadioButton radioButton4 = null;
 28 
 29     @Override
 30     protected void onCreate(Bundle savedInstanceState) {
 31         super.onCreate(savedInstanceState);
 32         setContentView(R.layout.activity_main);
 33         initView();
 34         initData();
 35 
 36         //設置初始化預設選項
 37         radioGroup.check(R.id.radioButton1);
 38         radioButton1.setBackgroundResource(R.drawable.img_draw_money_success);
 39         viewPager.setCurrentItem(0);
 40         tabHost.setCurrentTab(0);
 41 
 42         //getViewPager添加適配器
 43         MyAdapter adapter = new MyAdapter(list);
 44         viewPager.setAdapter(adapter);
 45 
 46     /**
 47      * viewPager設置滑動監聽,根據viewPager選中頁的position,設置tabHost頁卡選項的樣式
 48      */
 49 
 50         viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
 51             @Override
 52             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 53             }
 54 
 55             @Override
 56             public void onPageSelected(int position) {
 57                 if (position == 0){
 58                     radioButton1.setBackgroundResource(R.drawable.img_draw_money_success);
 59                     radioButton2.setBackgroundResource(R.drawable.img_draw_money_fail);
 60                     radioButton3.setBackgroundResource(R.drawable.img_draw_money_fail);
 61                     radioButton4.setBackgroundResource(R.drawable.img_draw_money_fail);
 62                 }else if(position == 1){
 63                     radioButton1.setBackgroundResource(R.drawable.img_draw_money_fail);
 64                     radioButton2.setBackgroundResource(R.drawable.img_draw_money_success);
 65                     radioButton3.setBackgroundResource(R.drawable.img_draw_money_fail);
 66                     radioButton4.setBackgroundResource(R.drawable.img_draw_money_fail);
 67                 }else if(position == 2){
 68                     radioButton1.setBackgroundResource(R.drawable.img_draw_money_fail);
 69                     radioButton2.setBackgroundResource(R.drawable.img_draw_money_fail);
 70                     radioButton3.setBackgroundResource(R.drawable.img_draw_money_success);
 71                     radioButton4.setBackgroundResource(R.drawable.img_draw_money_fail);
 72                 }else if(position == 3){
 73                     radioButton1.setBackgroundResource(R.drawable.img_draw_money_fail);
 74                     radioButton2.setBackgroundResource(R.drawable.img_draw_money_fail);
 75                     radioButton3.setBackgroundResource(R.drawable.img_draw_money_fail);
 76                     radioButton4.setBackgroundResource(R.drawable.img_draw_money_success);
 77                 }
 78             }
 79 
 80             @Override
 81             public void onPageScrollStateChanged(int state) {
 82             }
 83         });
 84 
 85     /**
 86      * 給radioGroup設置監聽,以此來改變ViewPager的頁面
 87      */
 88         radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
 89             @Override
 90             public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
 91                 switch (checkedId){
 92                     case R.id.radioButton1:
 93                         viewPager.setCurrentItem(0);
 94                         radioButton1.setBackgroundResource(R.drawable.img_draw_money_success);
 95                         radioButton2.setBackgroundResource(R.drawable.img_draw_money_fail);
 96                         radioButton3.setBackgroundResource(R.drawable.img_draw_money_fail);
 97                         radioButton4.setBackgroundResource(R.drawable.img_draw_money_fail);
 98                         break;
 99                     case R.id.radioButton2:
100                         viewPager.setCurrentItem(1);
101                         radioButton1.setBackgroundResource(R.drawable.img_draw_money_fail);
102                         radioButton2.setBackgroundResource(R.drawable.img_draw_money_success);
103                         radioButton3.setBackgroundResource(R.drawable.img_draw_money_fail);
104                         radioButton4.setBackgroundResource(R.drawable.img_draw_money_fail);
105                         break;
106                     case R.id.radioButton3:
107                         viewPager.setCurrentItem(2);
108                         radioButton1.setBackgroundResource(R.drawable.img_draw_money_fail);
109                         radioButton2.setBackgroundResource(R.drawable.img_draw_money_fail);
110                         radioButton3.setBackgroundResource(R.drawable.img_draw_money_success);
111                         radioButton4.setBackgroundResource(R.drawable.img_draw_money_fail);
112                         break;
113                     case R.id.radioButton4:
114                         viewPager.setCurrentItem(3);
115                         radioButton1.setBackgroundResource(R.drawable.img_draw_money_fail);
116                         radioButton2.setBackgroundResource(R.drawable.img_draw_money_fail);
117                         radioButton3.setBackgroundResource(R.drawable.img_draw_money_fail);
118                         radioButton4.setBackgroundResource(R.drawable.img_draw_money_success);
119                         break;
120                 }
121             }
122         });
123     }
124 
125     /**
126      * 初始化數據源
127      */
128     private void initData() {
129         list = new ArrayList<View>();
130         list.add(view1);
131         list.add(view2);
132         list.add(view3);
133         list.add(view4);
134     }
135 
136      /**
137      * 初始化控制項
138      */
139     private void initView() {
140         tabHost = getTabHost();
141 
142         viewPager = (ViewPager) findViewById(R.id.viewPager);
143         radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
144         radioButton1 = (RadioButton) findViewById(R.id.radioButton1);
145         radioButton2 = (RadioButton) findViewById(R.id.radioButton2);
146         radioButton3 = (RadioButton) findViewById(R.id.radioButton3);
147         radioButton4 = (RadioButton) findViewById(R.id.radioButton4);
148      /**
149      * 將每頁要展示的layout實例出來,添加到list裡面,最後通過適配器return回來要展示的相應的layout
150      */
151         LayoutInflater inflater = LayoutInflater.from(this);
152         view1 = inflater.inflate(R.layout.layout_one,null);
153         view2 = inflater.inflate(R.layout.layout_two,null);
154         view3 = inflater.inflate(R.layout.layout_three,null);
155         view4 = inflater.inflate(R.layout.layout_four,null);
156     }
157 
158 }

ViewPager適配器MyAdapter:

 1 public class MyAdapter extends PagerAdapter {
 2     private ArrayList<View> list = null;
 3 
 4     public MyAdapter(ArrayList<View> list) {
 5         this.list = list;
 6     }
 7 
 8     @Override
 9     public int getCount() {
10         return list.size();
11     }
12 
13     @Override
14     public boolean isViewFromObject(View arg0, Object arg1) {
15         return arg0 == arg1;
16     }
17 
18     @Override
19     public Object instantiateItem(ViewGroup container, int position) {
20         container.addView(list.get(position));
21         return list.get(position);
22     }
23     @Override
24     public void destroyItem(ViewGroup container, int position, Object object) {
25 
26         container.removeView(list.get(position));
27 
28     }
29 }

如果有什麼問題,歡迎留言!


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

-Advertisement-
Play Games
更多相關文章
  • 在程式開發中,數據層永遠是程式的核心結構之一。我們將現實事物進行抽象,使之變成一個個數據。對這些數據的加工處理是代碼中能體現技術水平的一大模塊,比如數據的請求、解析、緩存、持久化等等。適當的對數據進行持久化存儲可以實現應用的離線功能,以此提高用戶體驗。在iOS開發中,蘋果提供了四種持久化方案供我們選 ...
  • iOS7以後,導航控制器,自帶了從屏幕左邊緣右滑返回的手勢功能。 但是,如果自定義了導航欄返回按鈕,這項功能就失效了,需要自行實現。又如果需要修改手勢觸發範圍,還是需要自行實現。 廣泛應用的一種實現方案是,採用私有變數和Api,完成手勢交互和返回功能,自定義手勢觸發條件和額外功能。 另一種實現方案是 ...
  • 生命周期:因為Presenter是View創建的,我們需要確保完全地理解View的生命周期,特別是因為它將最有可能去處理狀態更新和非同步數據。舉個例子,每一個Presenter應該在View destroyed的情況下有一個取消非同步任務的方式,或者應該在用戶暫停或者恢復視圖事件時重置到原始狀態等等。最 ...
  • 前言: 關於.jar文件: 平時我們Android項目開發中經常會用到第三方的.jar文件。 其實.jar文件就是一個類似.zip文件的壓縮包,裡面包含了一些源代碼,註意的是.jar不包含資源文件(res、圖片等) 一、首先學習如何在Android studio中將android項目打成.jar文件 ...
  • FMDB的使用 一:瞭解FMDB的三個重要類 1.1 FMDataBase:提供SQLite資料庫的類,用來執行SQL語句 1.2 FMResultSet: 用在FMDatabase中執行查詢結果的類 1.3 FMDatabaseQueue:在多線程下查詢和更新資料庫用到的類 二:使用FMDB 2. ...
  • android主要三大佈局:線性佈局LinearLayout、相對佈局RelativeLayout、幀佈局FrameLayout。 ...
  • 記錄狀態欄和導航欄的設置和控制,統一在基類視圖控制器中完成。 狀態欄。 狀態欄高度為20,iOS7以後背景完全透明。 樣式枚舉如下: typedef NS_ENUM(NSInteger, UIStatusBarStyle) { UIStatusBarStyleDefault = 0, // Dark ...
  • 1、ApkTool工具 安裝ApkTool工具,該工具可以解碼得到資源文件,但不能得到Java源文件。安裝環境:需要安裝JRE1.61> 到http://code.google.com/p/android-apktool/ 下載apktool1.3.2.tar.bz2 和apktool-instal ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...