Android UI 開發之實現底部切換標籤
前言
本篇部落格要分享的一個UI效果——實現底部切換標籤,想必大家在一些應用上面遇到過這種效果了,最典型的就是微信了,可以左右滑動切換頁面,也可以點選標籤頁滑動頁面,它們是如何實現的呢,本篇部落格為了簡單隻介紹如何實現點選底部切換標籤頁。
先來看看我們想實現的效果圖:
這樣的頁面實現起來其實很簡單的,首先我們從佈局入手:
分為三部分
第一部分:頂部導航欄佈局
第二部分:中部顯示內容佈局
第三部分:底部標籤佈局
/BottomTabDemo/res/layout/activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:id="@+id/rl_main" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- 頂部 --> <RelativeLayout android:id="@+id/top_tab" android:layout_width="match_parent" android:layout_height="50dip" android:background="@color/topbar_bg" > <ImageView android:id="@+id/iv_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:focusable="false" android:src="@drawable/zhidao_logo" android:contentDescription="@null" /> </RelativeLayout> <!-- 底部tab --> <LinearLayout android:id="@+id/ll_bottom_tab" android:layout_width="match_parent" android:layout_height="54dp" android:layout_alignParentBottom="true" android:gravity="center_vertical" android:orientation="horizontal" android:baselineAligned="true"> <RelativeLayout android:id="@+id/rl_know" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.0" > <ImageView android:id="@+id/iv_know" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/btn_know_nor" android:contentDescription="@null"/> <TextView android:id="@+id/tv_know" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/iv_know" android:layout_centerHorizontal="true" android:text="@string/bottom_tab_know" android:textColor="@color/bottomtab_normal" android:textSize="12sp" /> </RelativeLayout> <RelativeLayout android:id="@+id/rl_want_know" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.0" > <ImageView android:id="@+id/iv_i_want_know" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/btn_wantknow_nor" android:contentDescription="@null" /> <TextView android:id="@+id/tv_i_want_know" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/iv_i_want_know" android:layout_centerHorizontal="true" android:text="@string/bottom_tab_wantknow" android:textColor="@color/bottomtab_normal" android:textSize="12sp" /> </RelativeLayout> <RelativeLayout android:id="@+id/rl_me" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.0" > <ImageView android:id="@+id/iv_me" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/btn_my_nor" android:contentDescription="@null" /> <TextView android:id="@+id/tv_me" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/iv_me" android:layout_centerHorizontal="true" android:text="@string/bottom_tab_my" android:textColor="@color/bottomtab_normal" android:textSize="12sp" /> </RelativeLayout> </LinearLayout> <!-- 內容部分, fragment切換 --> <LinearLayout android:id="@+id/content_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/line" android:layout_below="@+id/top_tab" android:orientation="vertical" > </LinearLayout> <View android:id="@+id/line" android:layout_width="match_parent" android:layout_height="1dp" android:layout_above="@id/ll_bottom_tab" android:background="@color/line" /> </RelativeLayout> </FrameLayout>
以上是佈局程式碼,下面就介紹如何通過點選標籤切換Fragment:
我們會發現,初始的時候是選中第一個標籤頁,圖片和字型的顏色區別於另外兩個標籤頁,所以我們要做的就是切換標籤的時候,就改變標籤的狀態
主要改兩個內容:
- 圖片
- 文字顏色
然後我們切換標籤顯示的是不同的Fragment,這裡我們有三個Fragment,所以我們定義三個不同的Fragment介面:
/BottomTabDemo/src/com/xiaowu/bottomtab/demo/ZhidaoFragment.java
/BottomTabDemo/src/com/xiaowu/bottomtab/demo/IWantKnowFragment.java
/BottomTabDemo/src/com/xiaowu/bottomtab/demo/MeFragment.java
每個Fragment對應不同的佈局檔案:
/BottomTabDemo/res/layout/main_tab1_fragment.xml
/BottomTabDemo/res/layout/main_tab2_fragment.xml
/BottomTabDemo/res/layout/main_tab3_fragment.xml
ok,這些定義好之後,我們就在主介面上編寫切換的程式碼了,如何對Fragment進行切換呢,定義以下方法:
/** * 新增或者顯示碎片 * * @param transaction * @param fragment */ private void addOrShowFragment(FragmentTransaction transaction, Fragment fragment) { if (currentFragment == fragment) return; if (!fragment.isAdded()) { // 如果當前fragment未被新增,則新增到Fragment管理器中 transaction.hide(currentFragment) .add(R.id.content_layout, fragment).commit(); } else { transaction.hide(currentFragment).show(fragment).commit(); } currentFragment = fragment; }
完整程式碼如下:
/BottomTabDemo/src/com/xiaowu/bottomtab/demo/MainActivity.java
package com.xiaowu.bottomtab.demo; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; /** * 主Activity * * @author wwj_748 * */ public class MainActivity extends FragmentActivity implements OnClickListener { // 三個tab佈局 private RelativeLayout knowLayout, iWantKnowLayout, meLayout; // 底部標籤切換的Fragment private Fragment knowFragment, iWantKnowFragment, meFragment, currentFragment; // 底部標籤圖片 private ImageView knowImg, iWantKnowImg, meImg; // 底部標籤的文字 private TextView knowTv, iWantKnowTv, meTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); initTab(); } /** * 初始化UI */ private void initUI() { knowLayout = (RelativeLayout) findViewById(R.id.rl_know); iWantKnowLayout = (RelativeLayout) findViewById(R.id.rl_want_know); meLayout = (RelativeLayout) findViewById(R.id.rl_me); knowLayout.setOnClickListener(this); iWantKnowLayout.setOnClickListener(this); meLayout.setOnClickListener(this); knowImg = (ImageView) findViewById(R.id.iv_know); iWantKnowImg = (ImageView) findViewById(R.id.iv_i_want_know); meImg = (ImageView) findViewById(R.id.iv_me); knowTv = (TextView) findViewById(R.id.tv_know); iWantKnowTv = (TextView) findViewById(R.id.tv_i_want_know); meTv = (TextView) findViewById(R.id.tv_me); } /** * 初始化底部標籤 */ private void initTab() { if (knowFragment == null) { knowFragment = new ZhidaoFragment(); } if (!knowFragment.isAdded()) { // 提交事務 getSupportFragmentManager().beginTransaction() .add(R.id.content_layout, knowFragment).commit(); // 記錄當前Fragment currentFragment = knowFragment; // 設定圖片文字的變化 knowImg.setImageResource(R.drawable.btn_know_pre); knowTv.setTextColor(getResources() .getColor(R.color.bottomtab_press)); iWantKnowImg.setImageResource(R.drawable.btn_wantknow_nor); iWantKnowTv.setTextColor(getResources().getColor( R.color.bottomtab_normal)); meImg.setImageResource(R.drawable.btn_my_nor); meTv.setTextColor(getResources().getColor(R.color.bottomtab_normal)); } } @Override public void onClick(View view) { switch (view.getId()) { case R.id.rl_know: // 知道 clickTab1Layout(); break; case R.id.rl_want_know: // 我想知道 clickTab2Layout(); break; case R.id.rl_me: // 我的 clickTab3Layout(); break; default: break; } } /** * 點選第一個tab */ private void clickTab1Layout() { if (knowFragment == null) { knowFragment = new ZhidaoFragment(); } addOrShowFragment(getSupportFragmentManager().beginTransaction(), knowFragment); // 設定底部tab變化 knowImg.setImageResource(R.drawable.btn_know_pre); knowTv.setTextColor(getResources().getColor(R.color.bottomtab_press)); iWantKnowImg.setImageResource(R.drawable.btn_wantknow_nor); iWantKnowTv.setTextColor(getResources().getColor( R.color.bottomtab_normal)); meImg.setImageResource(R.drawable.btn_my_nor); meTv.setTextColor(getResources().getColor(R.color.bottomtab_normal)); } /** * 點選第二個tab */ private void clickTab2Layout() { if (iWantKnowFragment == null) { iWantKnowFragment = new IWantKnowFragment(); } addOrShowFragment(getSupportFragmentManager().beginTransaction(), iWantKnowFragment); knowImg.setImageResource(R.drawable.btn_know_nor); knowTv.setTextColor(getResources().getColor(R.color.bottomtab_normal)); iWantKnowImg.setImageResource(R.drawable.btn_wantknow_pre); iWantKnowTv.setTextColor(getResources().getColor( R.color.bottomtab_press)); meImg.setImageResource(R.drawable.btn_my_nor); meTv.setTextColor(getResources().getColor(R.color.bottomtab_normal)); } /** * 點選第三個tab */ private void clickTab3Layout() { if (meFragment == null) { meFragment = new MeFragment(); } addOrShowFragment(getSupportFragmentManager().beginTransaction(), meFragment); knowImg.setImageResource(R.drawable.btn_know_nor); knowTv.setTextColor(getResources().getColor(R.color.bottomtab_normal)); iWantKnowImg.setImageResource(R.drawable.btn_wantknow_nor); iWantKnowTv.setTextColor(getResources().getColor( R.color.bottomtab_normal)); meImg.setImageResource(R.drawable.btn_my_pre); meTv.setTextColor(getResources().getColor(R.color.bottomtab_press)); } /** * 新增或者顯示碎片 * * @param transaction * @param fragment */ private void addOrShowFragment(FragmentTransaction transaction, Fragment fragment) { if (currentFragment == fragment) return; if (!fragment.isAdded()) { // 如果當前fragment未被新增,則新增到Fragment管理器中 transaction.hide(currentFragment) .add(R.id.content_layout, fragment).commit(); } else { transaction.hide(currentFragment).show(fragment).commit(); } currentFragment = fragment; } }
原始碼下載:http://download.csdn.net/detail/wwj_748/8495621
相關文章
- 使用bringToFont實現標籤切換
- 小程式標籤切換
- css3實現手機效果的“切換標籤”CSSS3
- Android開發之ViewPager切換動畫AndroidViewpager動畫
- Android開發之ViewPager+Fragment+FragmentTabHost實現底部選單AndroidViewpagerFragment
- vue2.0實現底部導航切換效果Vue
- flex佈局---標籤切換Flex
- 小程式標籤頁切換效果
- Android使用(TabLayout+ViewPager+fragment)與(FragmentTabHost+ViewPager+Fragment)實現底部狀態列切換AndroidTabLayoutViewpagerFragment
- Flutter UI使用Provide實現主題切換FlutterUIIDE
- 安卓開發:viewpager + fragment 實現滑動切換安卓ViewpagerFragment
- 微信小程式頁面功能-----標籤切換微信小程式
- Android開發之再探底部選單TabLayout與BottomNavigation實現方式AndroidTabLayoutNavigation
- Android UI 優化 使用和 標籤AndroidUI優化
- Android從零擼美團(三) - Android多標籤tab滑動切換 - 自定義View快速實現高度定製封裝AndroidView封裝
- Android從零擼美團(三) – Android多標籤tab滑動切換 – 自定義View快速實現高度定製封裝AndroidView封裝
- HarmonyOS NEXT應用開發之Tab元件實現增刪Tab標籤元件
- Android——Activity切換炫酷動畫實現Android動畫
- 移動端底部導航固定配合vue-router實現元件切換Vue元件
- iOS專案開發實戰——實現檢視切換動畫iOS動畫
- UI介面微信底部(ViewPager實現Tab,左右滑動+底部點選)UIViewpager
- 社群發現之標籤傳播演算法(LPA)python實現演算法Python
- Android 實現APP可切換多語言AndroidAPP
- Android Fragment實現按鈕間的切換AndroidFragment
- JavaWeb開發之Filter中的dispatcher標籤JavaWebFilter
- VS外掛開發實現簡單的 ViewModel 和 View 之間的切換View
- JSP簡單標籤標籤庫開發JS
- Android自定義控制元件之自定義ViewGroup實現標籤雲Android控制元件View
- Android UI控制元件系列:TabWidget(切換卡)AndroidUI控制元件
- iOS開發之APP內部切換語言iOSAPP
- 【Android】 banner+tab吸頂+viewpager切換+重新整理載入之實現AndroidViewpager
- 如何實現pre標籤中的內容自動換行
- android實現多圖片放大縮小的切換Android
- Android 動態佈局實現多主題切換Android
- 網站必備之簡繁切換功能實現網站
- Android開發之DrawerLayout實現抽屜效果Android
- 使用Broker實現DG切換
- 彩色 TabBar 切換動畫實現tabBar動畫