Android使用BottomNavigationBar实现底部导航栏

本文实例为大家分享了Android实现底部导航栏的具体代码,供大家参考,具体内容如下

展示

MODE_FIXED+BACKGROUND_STYLE_STATIC效果

DE_FIXED+BACKGROUND_STYLE_RIPPLE效果

MODE_SHIFTING+BACKGROUND_STYLE_STATIC效果

MODE_SHIFTING+BACKGROUND_STYLE_RIPPLE效果

1在Gradle中添加

compile ‘com.ashokvarma.android:bottom-navigation-bar:0.9.5'

2布局实现

 <com.ashokvarma.bottomnavigation.BottomNavigationBar
 android:layout_gravity="bottom"
 android:id="@+id/bottom_navigation_bar"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"/>

3类中Activity中添加BottomNavigationItem

BottomNavigationBar bottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar);

bottomNavigationBar
  .addItem(new BottomNavigationItem(R.drawable.ic_home_white_24dp, "Home"))
  .addItem(new BottomNavigationItem(R.drawable.ic_book_white_24dp, "Books"))
  .addItem(new BottomNavigationItem(R.drawable.ic_music_note_white_24dp, "Music"))
  .addItem(new BottomNavigationItem(R.drawable.ic_tv_white_24dp, "Movies & TV"))
  .addItem(new BottomNavigationItem(R.drawable.ic_videogame_asset_white_24dp, "Games"))
  .initialise();

4设置事件监听器TabChangeListener

 bottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener(){
  @Override
  public void onTabSelected(int position) {
  }
  @Override
  public void onTabUnselected(int position) {]
  }
  @Override
  public void onTabReselected(int position) {
  }
 });

5.代码实现

package com.android.xiaobai; 

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; 

import com.ashokvarma.bottomnavigation.BottomNavigationBar;
import com.ashokvarma.bottomnavigation.BottomNavigationItem; 

import java.util.ArrayList; 

import fragment.ContactsFragment;
import fragment.DongtaiFragment;
import fragment.MsgFragment; 

/**
 * Created by xiaobai on 2018/1/31/031.
 */ 

public class MessageActivity extends AppCompatActivity implements BottomNavigationBar.OnTabSelectedListener {
 private ArrayList<Fragment> fragments;
 private BottomNavigationBar bottomNavigationBar;
 private MsgFragment msgFragment;
 private ContactsFragment contactsFragment;
 private DongtaiFragment dongtaiFragment;
 private FragmentManager fragmentManager;
 private FragmentTransaction transaction;
 int lastSelectedPosition = 0; 

 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activty_message); 

 bottomNavigationBar = findViewById(R.id.bottom_navigation_bar);
 init();
 } 

 private void init() {
 //要先设计模式后再添加图标!
 //设置按钮模式 MODE_FIXED表示固定 MODE_SHIFTING表示转移
 bottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
 //设置背景风格
 // BACKGROUND_STYLE_STATIC表示静态的
 //BACKGROUND_STYLE_RIPPLE表示涟漪的,也就是可以变化的 ,跟随setActiveColor里面的颜色变化
 bottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_RIPPLE);
 //添加并设置图标、图标的颜色和文字
 bottomNavigationBar
  .addItem(new BottomNavigationItem(R.drawable.im_botton_message, "消息")).setActiveColor(R.color.blue)
  .addItem(new BottomNavigationItem(R.drawable.im_botton_contacts, "联系人")).setActiveColor(R.color.red)
  .addItem(new BottomNavigationItem(R.drawable.im_botton_dongtai, "动态")).setActiveColor(R.color.orign)
  .setFirstSelectedPosition(lastSelectedPosition )
  .initialise(); 

 bottomNavigationBar.setTabSelectedListener(this);
 setDefaultFragment();
 } 

 //设置初始界面
 private void setDefaultFragment() {
 fragmentManager = getSupportFragmentManager();
 transaction = fragmentManager.beginTransaction();
 transaction.replace(R.id.layFrame, MsgFragment.newInstance("消息"));
 transaction.commit();
 } 

 @Override
 public void onTabSelected(int position) {
 fragmentManager = getSupportFragmentManager();
 transaction = fragmentManager.beginTransaction();
 switch (position) {
  case 0:
  if (msgFragment == null) {
   msgFragment = MsgFragment.newInstance("消息");
  }
  transaction.replace(R.id.layFrame, msgFragment);
  break;
  case 1:
  if (contactsFragment == null) {
   contactsFragment = ContactsFragment.newInstance("联系人");
  }
  transaction.replace(R.id.layFrame, contactsFragment);
  break;
  case 2:
  if (dongtaiFragment == null) {
   dongtaiFragment = DongtaiFragment.newInstance("动态");
  }
  transaction.replace(R.id.layFrame, dongtaiFragment);
  break;
  default:
  break;
 }
 // 事务提交
 transaction.commit();
 } 

 @Override
 public void onTabUnselected(int position) {
 Log.d("dongtaiFragment", "onTabUnselected() called with: " + "position = [" + position + "]");
 } 

 @Override
 public void onTabReselected(int position) { 

 }
} 
package fragment; 

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; 

import com.android.xiaobai.R; 

/**
 * Created by xiaobai on 2018/1/31/031.
 */ 

public class MsgFragment extends BaseFragment {
 /**
 * 标志位,标志已经初始化完成
 */
 private boolean isPrepared;
 /**
 * 是否已被加载过一次,第二次就不再去请求数据了
 */
 private boolean mHasLoadedOnce;
 TextView textView;
 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 if (mView == null) {
  // 需要inflate一个布局文件 填充Fragment
  mView = inflater.inflate(R.layout.fragment_msg, container, false);
  initView();
  isPrepared = true;
// 实现懒加载
  lazyLoad();
 }
 //缓存的mView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个mView已经有parent的错误。
 ViewGroup parent = (ViewGroup) mView.getParent();
 if (parent != null) {
  parent.removeView(mView);
 } 

 return mView;
 }
 /**
 * 初始化控件
 */
 private void initView() { 

 } 

 @Override
 public void lazyLoad() {
 if (!isPrepared || !isVisible || mHasLoadedOnce) {
  return;
 }
 //填充各控件的数据
 mHasLoadedOnce = true;
 }
 public static MsgFragment newInstance(String param1) {
 MsgFragment fragment = new MsgFragment();
 Bundle args = new Bundle();
 args.putString("agrs1", param1);
 fragment.setArguments(args);
 return fragment;
 }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
 android:orientation="vertical"
 tools:context=".MessageActivity"> 

 <FrameLayout
 android:id="@+id/layFrame"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="1" /> 

 <com.ashokvarma.bottomnavigation.BottomNavigationBar
 android:id="@+id/bottom_navigation_bar"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_gravity="bottom" />
</LinearLayout> 
package fragment; 

import android.support.v4.app.Fragment;
import android.view.View; 

/**
 * Created by xiaobai on 2018/1/31/031.
 */ 

public abstract class BaseFragment extends Fragment {
 /**
 * Fragment当前状态是否可见
 */
 public boolean isVisible; 

 /**
 * inflate布局文件 返回的view
 */
 public View mView; 

 /**
 * 简化 findViewById
 *
 * @param viewId
 * @param <T>
 * @return
 */
 protected <T extends View> T find(int viewId) {
 return (T) mView.findViewById(viewId);
 } 

 /**
 * setUserVisibleHint是在onCreateView之前调用的
 * 设置Fragment可见状态
 */
 @Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
 super.setUserVisibleHint(isVisibleToUser);
 /**
  * 判断是否可见
  */
 if (getUserVisibleHint()) {
  isVisible = true;
  onVisible();
 } else {
  isVisible = false;
  onInvisible();
 }
 } 

 /**
 * 可见
 */
 private void onVisible() {
 lazyLoad();
 } 

 /**
 * 不可见
 */
 private void onInvisible() {
 } 

 /**
 * 延迟加载
 * 子类必须重写此方法
 */
 public abstract void lazyLoad();
}

BottomNavigationBar 图标和文字的间距:

在自己项目里value文件夹中的dimens.xml里面复写fixed_height_bottom_padding(默认是10dp,值越小,间距越大。适合的模式是BottomNavigationBar.MODE_FIXED)

如果模式是BottomNavigationBar.MODE_SHIFTING也是一样,复写和修改相关的参数

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现底部导航栏功能(选项卡)

    现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其中各个类的作用以及资源文件就不详细解释了,还有资源图片(在该Demo中借用了其它应用程序的资源图片)也不提供了,大家可以自行更换自己需要的资源图片.直接上各个布局文件或各个类的代码: 1. res/layout目录下的 maintabs.xml 源码: <?xml version="1.0&q

  • Android程序开发之Fragment实现底部导航栏实例代码

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

  • Android BottomNavigationBar底部导航控制器使用方法详解

    最近Google在自己推出的Material design中增加了Bottom Navigation导航控制.Android一直没有官方的导航控制器,自己实现确实是五花八门,有了这个规定之后,就类似苹果的底部Toolbar,以后我们的APP就会有一致的风格,先看一张效果: 这是官方在Material design中给出一张图,确实很不错. 1.BottomNavigationBar的下载地址 https://github.com/Ashok-Varma/BottomNavigation 2.使用

  • Android BottomNavigationBar底部导航的使用方法

    简介:Google推出的BottomNavigationBar底部导航栏 1 .基本的使用(add和replace方式) 2.扩展添加消息和图形 3.修改图片大小与文字间距 版本更新:2019-5-13 补充布局文件activity_main <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/

  • Android实现顶部底部双导航界面功能

    最近想弄一个双导航功能,查看了许多资料,总算是实现了功能,这边就算是给自己几个笔记吧! 先来看看效果 那么就开始实现了! 底部导航栏我选择用FragmentTabHost+Fragment来实现,这个方法我觉得挺好用的,代码量也不多 首先是开始的activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://s

  • Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退.于是就用这种方式实现了,效果还不错.github有详细说明,多余的就不说了. 这个roughike是这个项目的所有者(大神致敬). 我用的是Android studio开发,fragment全部导的V4的包(以为最开始就支持的是v4的,后面也支持了app.fragment). 首先是dependen

  • Android使用BottomNavigationBar实现导航栏功能

    基本属性 setActiveColor //选中item的字体颜色 setInActiveColor //未选中Item中的颜色 setBarBackgroundColor//背景颜色 setMode(BottomNavigationBar.MODE_FIXED) //填充模式,未选中的Item会显示文字,没有换挡动画 setMode(BottomNavigationBar.MODE_SHIFTING) //换挡模式,未选中的Item不会显示文字,选中的会显示文字 setBackgroundSt

  • ANDROID BottomNavigationBar底部导航栏的实现示例

    第一种介绍的就是使用开源库,因为使用开源库最简单,也更加的符合我们的审美标准,同时BottomNavigationBar还是符合当前的Material Design标准的. 效果展示 依赖 compile'com.ashokvarma.android:bottom-navigation-bar:1.2.0' 布局文件 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa

  • Android BottomNavigationView底部导航效果

    BottomNavigationView 很早之前就在 Material Design 中出现了,但是直到 Android Support Library 25 中才增加了 BottomNavigationView 控件.也就是说如果使用官方的BottomNavigationView控件必须让targetSdkVersion >= 25,这样才能引入25版本以上的兼容包. 接下来我们来看看如何使用BottomNavigationView. 使用BottomNavigationView 需要添加d

  • Android使用BottomNavigationBar实现底部导航栏

    本文实例为大家分享了Android实现底部导航栏的具体代码,供大家参考,具体内容如下 展示 MODE_FIXED+BACKGROUND_STYLE_STATIC效果 DE_FIXED+BACKGROUND_STYLE_RIPPLE效果 MODE_SHIFTING+BACKGROUND_STYLE_STATIC效果 MODE_SHIFTING+BACKGROUND_STYLE_RIPPLE效果 1在Gradle中添加 compile 'com.ashokvarma.android:bottom-n

  • 解决android 显示内容被底部导航栏遮挡的问题

    描述: 由于产品需求,要求含有EditText的界面全屏显示,最好的解决方式是使用AndroidBug5497Workaround.assistActivity(this) 的方式来解决,但是华为和魅族手机系统自带的有底部导航栏,会造成一些布局被遮挡. 解决方案:在values-21的style.xml中添加android:windowDrawsSystemBarBackgrounds"并将值设置为false,方式如下 在style引用的主题里面加入android:windowDrawsSyst

  • Android开发快速实现底部导航栏示例

    目录 Tint 着色器 依赖(AndroidX) 布局 编写渲染颜色选择器-tint_selector_menu_color menu 文件中 icon-nav_bottom_menu BottomNavigationView的点击事件 配合ViewPager实现Tab栏 对应的适配器 Tint 着色器 优点:去除“无用”图片,节省空间 配合BottomNavigationView,实现一个快速,简洁的Tab栏 传统做法:Tab 切换,字体变色.图片变色.至少给我提供八张图,四张默认,四张选中,

  • 微信小程序实战之仿android fragment可滑动底部导航栏(4)

    底部3-5个选项的底部导航栏,目前在移动端上是主流布局之一,因此腾讯官方特地做了,可以通过设置,就可以做出了一个底部的导航栏. 相关教程:微信小程序教程系列之设置标题栏和导航栏(7) 但是通过设置的这个底部的导航栏,功能上比较固定,它必须要设置与它对应的一个页面,而且并不能滑动. 在业务上,有时候会比较限制,并不能完全满足所需. 又例如早前有人拿着UI稿问我,这种广告轮播图的样式,在小程序能不能实现呢? 我当时没有想了下,还不是很确定,因为小程序的轮播图的那几个小点点实在比较普通,样式单一. 因

  • Android使用RadioGroup实现底部导航栏

    RadioGroup实现底部导航栏效果,如图:: 实现可最基本的导航栏功能,不能左右滑动,只能点击 1.内嵌的fragment的布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical&q

  • Android实现美团外卖底部导航栏动画

    体验了一下美团外卖的底部导航栏,感觉动画很流畅,分割线被顶起,还有图标的动画,可能用的lottie,觉得分割线被顶起可以自己写动画,所以试着写了一下 . 想自定义view点击实现动画效果,自定义view的区域一定比背景需要被顶起的线要高,所以布局如下: 开始绘制view,被顶起的曲线分三段,前后两端曲线对称的,用path绘制曲线,中间段绘制贝塞尔曲线. 那么我们分别绘制三段曲线,用ValueAnimator实现效果, private void initAnim() { value = start

  • android效果TapBarMenu绘制底部导航栏的使用方式示例

    其他的不多说了!我们来看看效果吧       一.实现方式一:直接引入compile方式 Add the dependency to your build.gradle: compile 'com.github.michaldrabik:tapbarmenu:1.0.5' 布局设计 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://sc

  • android实现简单底部导航栏

    本文实例为大家分享了android实现底部导航栏的具体代码,供大家参考,具体内容如下 常见的底部导航栏 动态效果 实现步骤 1.底部导航栏样式 我们应该在项目的res文件夹下新建一个menu文件夹,用来装menu布局文件 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"&g

  • Android实现简单底部导航栏 Android仿微信滑动切换效果

    Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏的设置方法类似于TabLayout的关联,View需要创建关联方法,用来关联VIewPager; 3. 通过关联方法获取ViewPager实例后,根据ViewPager页面数创建底部导航栏的图标按钮; 代码实现: 1. 新建第一个自定义View, 图标 + 文字 的底部按钮; /** * 自定义控件

随机推荐