溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android實(shí)現(xiàn)底部狀態(tài)欄切換的兩種方式

發(fā)布時(shí)間:2021-04-16 10:00:53 來源:億速云 閱讀:377 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章主要介紹了Android實(shí)現(xiàn)底部狀態(tài)欄切換的兩種方式,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

Android開發(fā)過程中,特別是新開的項(xiàng)目,底部狀態(tài)欄的切換使用的頻率非常的高,主要的實(shí)現(xiàn)方式有:

(1)、TabLayout + Fragment
    (2)、FragmentTabHost + Fragment
    (3)、BottomNavigationView + Fragment
    (4)、RidioGroup + Fragment

這里我先介紹前面兩種實(shí)現(xiàn)方式,后面兩種后期再貼出實(shí)現(xiàn)方式。

一、使用TabLayout + Fragment + ViewPager實(shí)現(xiàn)

1、實(shí)現(xiàn)步驟:

(1)、布局文件中定義TabLayout控件
    (2)、定義切換的每個(gè)Fragment布局文件
    (3)、定義切換的每個(gè)Fragment的Java類
    (4)、定義TabLayoutMainActivity類
    (5)、效果圖演示

2、實(shí)現(xiàn)過程:

(1)、布局文件中定義TabLayout控件(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context="com.showly.bottomnavigationbardemo.TabLayoutMainActivity">
 <android.support.v4.view.ViewPager
 android:id="@+id/viewpager_content_view"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="1"
 android:scrollbars="none" />
 <android.support.design.widget.TabLayout
 android:id="@+id/tab_layout_view"
 android:layout_width="match_parent"
 android:layout_height="50dp"
 app:tabGravity="fill"
 app:tabIndicatorHeight="0dp"
 app:tabMode="fixed"
 app:tabSelectedTextColor="#FB8081"
 app:tabTextColor="#A0A0A0" />
</LinearLayout>

(2)、定義切換的每個(gè)Fragment布局文件(fragment_frist.xml)

這里有四個(gè)Tab類別(首頁(yè)、娛樂、游戲、我的),布局都類似,這里只貼出其中一個(gè)

<?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"
 android:background="#fff"
 android:orientation="vertical">
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_centerInParent="true"
 android:text="首頁(yè)"
 android:textColor="#000"/>
</RelativeLayout>

(3)、定義切換的每個(gè)Fragment的Java類(FristFragment.class)

這里的Java 類實(shí)現(xiàn)方式也相似,貼出其中一個(gè)

package com.showly.bottomnavigationbardemo.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.showly.bottomnavigationbardemo.R;
public class FristFragment extends Fragment {
 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
 View view = inflater.inflate(R.layout.fragment_frist, null);
 return view;
 }
}

(4)、定義TabLayoutMainActivity類(TabLayoutMainActivity.class)

package com.showly.bottomnavigationbardemo;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import com.showly.bottomnavigationbardemo.fragment.FourthlyFragment;
import com.showly.bottomnavigationbardemo.fragment.FristFragment;
import com.showly.bottomnavigationbardemo.fragment.SecondFragment;
import com.showly.bottomnavigationbardemo.fragment.ThirtlyFragment;
public class TabLayoutMainActivity extends AppCompatActivity {
 //未選中的Tab圖片
 private int[] unSelectTabRes = new int[]{R.drawable.i8live_menu_home_normal
  , R.drawable.i8live_menu_information_normal, R.drawable.i8live_menu_game_normal, R.drawable.i8live_menu_personl_normal};
 //選中的Tab圖片
 private int[] selectTabRes = new int[]{R.drawable.i8live_menu_home_press, R.drawable.i8live_menu_information_press
  , R.drawable.i8live_menu_game_press, R.drawable.i8live_menu_personl_press};
 //Tab標(biāo)題
 private String[] title = new String[]{"首頁(yè)", "娛樂", "游戲", "我的"};
 private ViewPager viewPager;
 private TabLayout tabLayout;
 private TabLayout.Tab tabAtOne;
 private TabLayout.Tab tabAttwo;
 private TabLayout.Tab tabAtthree;
 private TabLayout.Tab tabAtfour;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 getSupportActionBar().hide();//隱藏掉整個(gè)ActionBar
 setContentView(R.layout.activity_main);
 initView();
 initData();
 initListener();
 }
 private void initView() {
 viewPager = (ViewPager) findViewById(R.id.viewpager_content_view);
 tabLayout = (TabLayout) findViewById(R.id.tab_layout_view);
 //使用適配器將ViewPager與Fragment綁定在一起
 viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()));
 //將TabLayout與ViewPager綁定
 tabLayout.setupWithViewPager(viewPager);
 /* //設(shè)置方式一:
 //獲取底部的單個(gè)Tab
 tabAtOne = tabLayout.getTabAt(0);
 tabAttwo = tabLayout.getTabAt(1);
 tabAtthree = tabLayout.getTabAt(2);
 tabAtfour = tabLayout.getTabAt(3);
 //設(shè)置Tab圖片
 tabAtOne.setIcon(R.drawable.i8live_menu_home_press);
 tabAttwo.setIcon(R.drawable.i8live_menu_information_normal);
 tabAtthree.setIcon(R.drawable.i8live_menu_game_normal);
 tabAtfour.setIcon(R.drawable.i8live_menu_personl_normal);*/
 //設(shè)置方式二:
 for (int i = 0; i < title.length; i++) {
  if (i == 0) {
  tabLayout.getTabAt(0).setIcon(selectTabRes[0]);
  } else {
  tabLayout.getTabAt(i).setIcon(unSelectTabRes[i]);
  }
 }
 }
 private void initData() {
 }
 private void initListener() {
 //TabLayout切換時(shí)導(dǎo)航欄圖片處理
 tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
  @Override
  public void onTabSelected(TabLayout.Tab tab) {//選中圖片操作
  for (int i = 0; i < title.length; i++) {
   if (tab == tabLayout.getTabAt(i)) {
   tabLayout.getTabAt(i).setIcon(selectTabRes[i]);
   viewPager.setCurrentItem(i);
   }
  }
  }
  @Override
  public void onTabUnselected(TabLayout.Tab tab) {//未選中圖片操作
  for (int i = 0; i < title.length; i++) {
   if (tab == tabLayout.getTabAt(i)) {
   tabLayout.getTabAt(i).setIcon(unSelectTabRes[i]);
   }
  }
  }
  @Override
  public void onTabReselected(TabLayout.Tab tab) {
  }
 });
 }
 //自定義適配器
 public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
 public MyFragmentPagerAdapter(FragmentManager fm) {
  super(fm);
 }
 @Override
 public Fragment getItem(int position) {
  if (position == 1) {
  return new SecondFragment();//娛樂
  } else if (position == 2) {
  return new ThirtlyFragment();//游戲
  } else if (position == 3) {
  return new FourthlyFragment();//我的
  }
  return new FristFragment();//首頁(yè)
 }
 @Override
 public int getCount() {
  return title.length;
 }
 @Override
 public CharSequence getPageTitle(int position) {
  return title[position];
 }
 }
}

(5)、效果圖演示

Android實(shí)現(xiàn)底部狀態(tài)欄切換的兩種方式

二、使用FragmentTabHost+ Fragment + ViewPager實(shí)現(xiàn)

1、實(shí)現(xiàn)步驟:

(1)、布局文件中定義FragmentTabHost控件
    (2)、定義底部菜單欄布局
    (3)、定義切換的每個(gè)Fragment布局文件
    (4)、定義切換的每個(gè)Fragment的Java類
    (5)、切換按鈕的圖片
    (6)、定義FragmentTabHostMainActivity類
    (7)、效果圖演示

2、實(shí)現(xiàn)過程:

(1)、布局文件中定義FragmentTabHost控件(fragment_tabhost_activity.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#fff"
 android:orientation="vertical">
 <android.support.v4.view.ViewPager
 android:id="@+id/vp_pager"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="1"
 android:scrollbars="none" />
 <android.support.v4.app.FragmentTabHost
 android:id="@android:id/tabhost"
 android:layout_width="match_parent"
 android:background="#3000"
 android:layout_height="65dp">
 <FrameLayout
  android:id="@android:id/tabcontent"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
 </android.support.v4.app.FragmentTabHost>
</LinearLayout>

(2)、定義底部菜單欄布局(tab_content.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:padding="2dp"
 android:orientation="vertical">

 <ImageView
 android:id="@+id/iv_imageview"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center_horizontal"
 android:background="@drawable/i8live_menu_home_normal" />

 <TextView
 android:id="@+id/tv_item"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center_horizontal"
 android:layout_marginTop="5dp"
 android:text="首頁(yè)" />
</LinearLayout>

(3)、定義切換的每個(gè)Fragment布局文件(fragment_frist.xml)

這里有四個(gè)Tab類別(首頁(yè)、娛樂、游戲、我的),布局都類似,這里只貼出其中一個(gè)

<?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"
 android:background="#fff"
 android:orientation="vertical">
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_centerInParent="true"
 android:text="首頁(yè)"
 android:textColor="#000"/>
</RelativeLayout>

(4)、定義切換的每個(gè)Fragment的Java類(FristFragment.class)

這里的Java 類實(shí)現(xiàn)方式也相似,貼出其中一個(gè)

package com.showly.bottomnavigationbardemo.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.showly.bottomnavigationbardemo.R;
public class FristFragment extends Fragment {
 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
 View view = inflater.inflate(R.layout.fragment_frist, null);
 return view;
 }
}

(5)、切換按鈕的圖片(tab_main.xml)

這里有四個(gè)是相似的,只貼出其中一個(gè)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- 切換選中之后的圖片-->
 <item android:drawable="@drawable/i8live_menu_home_press" android:state_selected="true"/>
 <!-- 未選中的圖片-->
 <item android:drawable="@drawable/i8live_menu_home_normal"/>
</selector>

(6)、定義FragmentTabHostMainActivity類(FragmentTabHostMainActivity.class)

package com.showly.bottomnavigationbardemo;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTabHost;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
import com.showly.bottomnavigationbardemo.fragment.FourthlyFragment;
import com.showly.bottomnavigationbardemo.fragment.FristFragment;
import com.showly.bottomnavigationbardemo.fragment.SecondFragment;
import com.showly.bottomnavigationbardemo.fragment.ThirtlyFragment;
import java.util.ArrayList;
import java.util.List;
public class FragmentTabHostMainActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener {
 private int[] selectTabRes = new int[]{R.drawable.tab_main, R.drawable.tab_infomation
  , R.drawable.tab_game, R.drawable.tab_personal};
 //Tab標(biāo)題
 private String[] title = new String[]{"首頁(yè)", "娛樂", "游戲", "我的"};
 private Class fragmentArry[] = {FristFragment.class, SecondFragment.class, ThirtlyFragment.class, FourthlyFragment.class};
 private List<Fragment> fragmentList = new ArrayList();
 private ViewPager viewPager;
 private FragmentTabHost tabHost;
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.fragment_tabhost_activity);
 initView();
 initData();
 initListener();
 }
 /**
 * 初始化Fragment并給ViewPager添加適配器
 */
 private void initVaper() {
 FristFragment fristFragment = new FristFragment();
 SecondFragment secondFragment = new SecondFragment();
 ThirtlyFragment thirtlyFragment = new ThirtlyFragment();
 FourthlyFragment fourthlyFragment = new FourthlyFragment();
 fragmentList.add(fristFragment);
 fragmentList.add(secondFragment);
 fragmentList.add(thirtlyFragment);
 fragmentList.add(fourthlyFragment);
 //ViewPager添加適配器
 viewPager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(), fragmentList));
 tabHost.getTabWidget().setDividerDrawable(null);
 }
 private void initView() {
 viewPager = (ViewPager) findViewById(R.id.vp_pager);
 tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);//綁定tabhost
 tabHost.setup(this, getSupportFragmentManager(), R.id.vp_pager);//TabHost綁定viewpager
 //獲取item的個(gè)數(shù)
 int count = title.length;
 for (int i = 0; i < count; i++) {
  //設(shè)置每個(gè)TabHost布局
  TabHost.TabSpec tabSpec = tabHost.newTabSpec(title[i])
   .setIndicator(getTabItemView(i));
  //item與fragment關(guān)聯(lián)
  tabHost.addTab(tabSpec, fragmentArry[i], null);
  tabHost.setTag(i);
 }
 //初始化TabHost文字顏色
 upDateTab(tabHost);
 //給ViewPager設(shè)置適配器
 initVaper();
 }
 /**
 * 更新文字顏色。
 *
 * @param mTabHost
 */
 private void upDateTab(FragmentTabHost mTabHost) {
 for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) {
  TextView tv = (TextView) mTabHost.getTabWidget().getChildAt(i).findViewById(R.id.tv_item);
  if (mTabHost.getCurrentTab() == i) {//選中
  tv.setTextColor(Color.parseColor("#FF5959"));
  } else {//不選中
  tv.setTextColor(Color.parseColor("#777777"));
  }
 }
 }
 /**
 * 設(shè)置每個(gè)Item布局
 */
 private View getTabItemView(int i) {
 View view = LayoutInflater.from(this).inflate(R.layout.tab_content, null);
 ImageView itemImg = (ImageView) view.findViewById(R.id.iv_imageview);
 TextView itemText = (TextView) view.findViewById(R.id.tv_item);
 itemImg.setBackgroundResource(selectTabRes[i]);
 itemText.setText(title[i]);
 return view;
 }
 private void initData() {
 }
 private void initListener() {
 viewPager.addOnPageChangeListener(this);
 tabHost.setOnTabChangedListener(this);
 }
 @Override
 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 }
 @Override
 public void onPageSelected(int position) {
 TabWidget widget = tabHost.getTabWidget();
 int oldFocusability = widget.getDescendantFocusability();
 widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);//設(shè)置View覆蓋子類控件而直接獲得焦點(diǎn)
 tabHost.setCurrentTab(position);//根據(jù)位置Postion設(shè)置當(dāng)前的Tab
 widget.setDescendantFocusability(oldFocusability);//設(shè)置取消分割線
 }
 @Override
 public void onPageScrollStateChanged(int state) {
 }
 @Override
 public void onTabChanged(String tabId) {
 int position = tabHost.getCurrentTab();
 viewPager.setCurrentItem(position);//把選中的Tab的位置賦給適配器,讓它控制頁(yè)面切換
 upDateTab(tabHost);//設(shè)置TabHost文字顏色
 }
 /**
 * 適配器
 * */
 public class MyFragmentAdapter extends FragmentPagerAdapter {
 List<Fragment> list;
 public MyFragmentAdapter(FragmentManager fm, List<Fragment> list) {
  super(fm);
  this.list = list;
 }
 @Override
 public Fragment getItem(int position) {
  return list.get(position);
 }
 @Override
 public int getCount() {
  return list.size();
 }
 }

(7)、效果圖演示

Android實(shí)現(xiàn)底部狀態(tài)欄切換的兩種方式

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Android實(shí)現(xiàn)底部狀態(tài)欄切換的兩種方式”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI