Android开发过程中,特别是新开的项目,底部状态栏的切换使用的频率非常的高,主要的实现方式有:

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

这里我先介绍前面两种实现方式,后面两种后期再贴出实现方式。

一、使用TabLayout Fragment ViewPager实现

1、实现步骤:

(1)、布局文件中定义TabLayout控件
    (2)、定义切换的每个Fragment布局文件
    (3)、定义切换的每个Fragment的Java类
    (4)、定义TabLayoutMainActivity类
    (5)、效果图演示

2、实现过程:

(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)、定义切换的每个Fragment布局文件(fragment_frist.xml)

这里有四个Tab类别(首页、娱乐、游戏、我的),布局都类似,这里只贴出其中一个

<?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="首页"
 android:textColor="#000"/>
</RelativeLayout>

(3)、定义切换的每个Fragment的Java类(FristFragment.class)

这里的Java 类实现方式也相似,贴出其中一个

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标题
 private String[] title = new String[]{"首页", "娱乐", "游戏", "我的"};
 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();//隐藏掉整个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);
 /* //设置方式一:
 //获取底部的单个Tab
 tabAtOne = tabLayout.getTabAt(0);
 tabAttwo = tabLayout.getTabAt(1);
 tabAtthree = tabLayout.getTabAt(2);
 tabAtfour = tabLayout.getTabAt(3);
 //设置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);*/
 //设置方式二:
 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切换时导航栏图片处理
 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();//首页
 }
 @Override
 public int getCount() {
  return title.length;
 }
 @Override
 public CharSequence getPageTitle(int position) {
  return title[position];
 }
 }
}

(5)、效果图演示

二、使用FragmentTabHost Fragment ViewPager实现

1、实现步骤:

(1)、布局文件中定义FragmentTabHost控件
    (2)、定义底部菜单栏布局
    (3)、定义切换的每个Fragment布局文件
    (4)、定义切换的每个Fragment的Java类
    (5)、切换按钮的图片
    (6)、定义FragmentTabHostMainActivity类
    (7)、效果图演示

2、实现过程:

(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="首页" />
</LinearLayout>

(3)、定义切换的每个Fragment布局文件(fragment_frist.xml)

这里有四个Tab类别(首页、娱乐、游戏、我的),布局都类似,这里只贴出其中一个

<?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="首页"
 android:textColor="#000"/>
</RelativeLayout>

(4)、定义切换的每个Fragment的Java类(FristFragment.class)

这里的Java 类实现方式也相似,贴出其中一个

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)

这里有四个是相似的,只贴出其中一个

<?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标题
 private String[] title = new String[]{"首页", "娱乐", "游戏", "我的"};
 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的个数
 int count = title.length;
 for (int i = 0; i < count; i  ) {
  //设置每个TabHost布局
  TabHost.TabSpec tabSpec = tabHost.newTabSpec(title[i])
   .setIndicator(getTabItemView(i));
  //item与fragment关联
  tabHost.addTab(tabSpec, fragmentArry[i], null);
  tabHost.setTag(i);
 }
 //初始化TabHost文字颜色
 upDateTab(tabHost);
 //给ViewPager设置适配器
 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"));
  }
 }
 }
 /**
 * 设置每个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);//设置View覆盖子类控件而直接获得焦点
 tabHost.setCurrentTab(position);//根据位置Postion设置当前的Tab
 widget.setDescendantFocusability(oldFocusability);//设置取消分割线
 }
 @Override
 public void onPageScrollStateChanged(int state) {
 }
 @Override
 public void onTabChanged(String tabId) {
 int position = tabHost.getCurrentTab();
 viewPager.setCurrentItem(position);//把选中的Tab的位置赋给适配器,让它控制页面切换
 upDateTab(tabHost);//设置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实现底部状态栏切换的两种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对Devmax网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Android实现底部状态栏切换的两种方式的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. 使用UINavigationController进行iOS 7自定义当前转换

    解决方法我有同样的问题,并解决了在设置此框架之前将toViewController添加到容器.反转如下的行:

  6. iOS – UINavigationController,隐藏navigationBar

    快速以及obj-c的答案非常受欢迎编辑:我试过以下各种版本,问题依然存在–.-编辑2:打印:在viewDidLoad返回20之后解决方法更新:只需在ViewDidLoad方法中添加它即可

  7. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  8. ios – TabBarController上的彩色状态栏,导航栏无法正常工作

    我在这里阅读了很多帖子,并尝试了大多数提到的选项,但没有人为我解决问题.我有一个基于标签栏控制器的应用程序.每个选项卡都是一个UIViewController,顶部有一个导航栏.将此代码添加到AppDelegate为我提供了带有白色文本的橙色导航栏,但是带有黑色文本的白色状态栏.阅读各种页面上的答案建议将以下内容添加到View控制器:然后在ViewDidLoad中调用它:这让我得到一个带有白色文本的白色状态栏,我现在如何让状态栏变为橙色以匹配我的导航栏?

  9. ios – 状态栏大小错误,包含UINavigationController

    这是你永远不应该做的事情.只需将这些行添加到您的代码中:现在导航控制器的视图有一个框架,并相对于其超视图维护它.

  10. ios – 导航工具栏从全屏视频返回后垂直延伸

    第一个屏幕截图是在全屏播放视频之前拍摄的.第二个是在视频全屏打开并关闭后拍摄的.知道为什么导航工具栏有扩展吗?注意:汉堡包按钮不是导航项目的一部分.它在父级的覆盖中伪造,将其子控制器保存在标准容器中.源内没有什么特别之处:更新:这似乎仅在最新版本的iOS9.3上存在问题解决方法从截图中看,状态栏的高度看起来会加倍.试试这个:-在播放视频之前,请隐藏状态栏结束视频后,显示状态栏

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部