android : 底部导航栏的实现(使用ViewPager和BottomNavigationView)

这篇具有很好参考价值的文章主要介绍了android : 底部导航栏的实现(使用ViewPager和BottomNavigationView)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

android : 底部导航栏的实现(使用ViewPager和BottomNavigationView)

 

本案例中需要用的控件ViewPager和BottomNavigationView

  1. ViewPager:主要是页面的切换
  2. Fragment:碎片(也就是每个页面的内容)
  3. BottomNavigationView:底部导航栏

非常简单,主要就是一个Viewpager和BottomNavigationView

先来说一下思路:BottomNavigationView底部导航栏   ViewPager+Fragment页面

        那么我么如何设置两个控件联动(仅需要两个方法即可)

  •         ViewPager中的滑动页面监听 接口onPageSelected()方法
  •         BottomNavigationViewr中的 底部图标切换监听 接口onNavigationItemSelected()方法
    •   简单地说就是当我们滑动页面的时候改变底部导航栏图标id
    •    点击底部导航栏时更改viewpager界面

activity_main.xml

注意:BottomNavigationView需要一个app:menu菜单文件(下面会作讲解)

<?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=".MainActivity"

    >

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/main_vp"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/main_bnv"
        android:layout_width="match_parent"
        android:layout_height="73dp"
        app:labelVisibilityMode="labeled"
        app:menu="@menu/bottom_nav_menu"
        />
</LinearLayout>

 bottom_nav_menu.xml

主要就是两个属性 icon图标 title文字

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_home"
        android:icon="@android:drawable/star_big_on"
        android:title="首页" />
    <item
        android:id="@+id/menu_service"
        android:icon="@android:drawable/ic_menu_mylocation"
        android:title="全部服务" />
    <item
        android:id="@+id/menu_rich"
        android:icon="?attr/actionModePasteDrawable"
        android:title="精准扶贫" />
    <item
        android:id="@+id/menu_news"
        android:icon="@android:drawable/ic_menu_my_calendar"
        android:title="新闻" />
    <item
        android:id="@+id/menu_mine"
        android:icon="@android:drawable/ic_menu_myplaces"
        android:title="个人中心" />
</menu>

接下来创建空白的Fragment,不用做任何修改

创建过程如下:

android : 底部导航栏的实现(使用ViewPager和BottomNavigationView) 

创建完成后会生成Fragment的java文件和对应的XML文件 

Fragment文件不需要修改,后期只需要传入两个参数即可

创建5个即可,创建方法相同,以下只示例一个

示例:

HomeFragment.java

package com.example.myapplication;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.material.tabs.TabLayout;

import java.util.ArrayList;
import java.util.List;

public class HomeFragment extends Fragment {

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";


    private String mParam1;
    private String mParam2;

    public HomeFragment() {

    }


    public static HomeFragment newInstance(String param1, String param2) {
        HomeFragment fragment = new HomeFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


    }


}

fragment_home.xml

<?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" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="首页"
        android:textSize="50sp"
        android:gravity="center"
   />

</LinearLayout>

 MainActivity.java


package com.example.myapplication;

import android.os.Bundle;
import android.view.MenuItem;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import com.google.android.material.bottomnavigation.BottomNavigationView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    List<Fragment> fragmentList = new ArrayList<>();

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

        ViewPager viewPager = findViewById(R.id.main_vp);
        BottomNavigationView bottomNavigationView = findViewById(R.id.main_bnv);

        initData();

        MainActivityAdapter adapter = new MainActivityAdapter(getSupportFragmentManager(), fragmentList);
        viewPager.setAdapter(adapter);
//        页面更改监听
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                switch (position) {
                    case 0:
                        bottomNavigationView.setSelectedItemId(R.id.menu_home);
                        break;
                    case 1:
                        bottomNavigationView.setSelectedItemId(R.id.menu_service);
                        break;
                    case 2:
                        bottomNavigationView.setSelectedItemId(R.id.menu_rich);
                        break;
                    case 3:
                        bottomNavigationView.setSelectedItemId(R.id.menu_news);
                        break;
                    case 4:
                        bottomNavigationView.setSelectedItemId(R.id.menu_mine);
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
//        图标选择监听
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()){
                    case R.id.menu_home:
                        viewPager.setCurrentItem(0);
                        break;
                    case R.id.menu_service:
                        viewPager.setCurrentItem(1);
                        break;
                    case R.id.menu_rich:
                        viewPager.setCurrentItem(2);
                        break;
                    case R.id.menu_news:
                        viewPager.setCurrentItem(3);
                        break;
                    case R.id.menu_mine:
                        viewPager.setCurrentItem(4);
                        break;
                }
                return true;
            }
        });
    }

    private void initData() {
        HomeFragment homeFragment = HomeFragment.newInstance("首页", "");
        fragmentList.add(homeFragment);
        ServiceFragment serviceFragment = ServiceFragment.newInstance("全部服务", "");
        fragmentList.add(serviceFragment);
        RichFragment richFragment = RichFragment.newInstance("精准扶贫", "");
        fragmentList.add(richFragment);
        NewsFragment newsFragment = NewsFragment.newInstance("新闻", "");
        fragmentList.add(newsFragment);

       MineFragment mineFragment = MineFragment.newInstance("个人中心", "");
        fragmentList.add(mineFragment);
    }


}


接下来是Viewpager的适配器

 MainActivityAdapter.java文章来源地址https://www.toymoban.com/news/detail-436794.html

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;

import java.util.ArrayList;
import java.util.List;

public class MainActivityAdapter extends FragmentStatePagerAdapter {
    List<Fragment> fragmentList=new ArrayList<>();

    public MainActivityAdapter(@NonNull FragmentManager fm, List<Fragment> fragmentList) {
        super(fm);
        this.fragmentList = fragmentList;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

到了这里,关于android : 底部导航栏的实现(使用ViewPager和BottomNavigationView)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android 关于TabLayout联动ViewPager2 实现底部导航栏

    最近在心血来潮想写在app 不过我关于android可以说是0基础 在写底部导航栏的时候去问了大佬才知道TabLayout和ViewPager 花了两天才看懂... 这里只是简单介绍因为我不准备专门做安卓软件所以在学的途中很多地方没有认真记 本篇文章使用的代码是Java 这里官方是有将两个进行联动

    2024年01月25日
    浏览(34)
  • 【Android】底部导航栏【BottomNavigationView】+【ViewPage2】

    问题需求 实现底部导航栏切换 问题解决 最简单的实现方式就是使用系统自动生成的模板页面,但是有时候会有一些问题,特别是需要去除【ActionBar】的情况下,这种情况下使用系统的模板页面就不好用了,此时可以使用下面这种解决方式。 【BottomNavigationView】+【ViewPage2】

    2023年04月18日
    浏览(38)
  • Android开发:利用Android Studio自带的底部导航栏和ViewPager+TabLayout创建顶部导航栏

    目录 效果图 底部导航栏 ​编辑 顶部导航栏 底部导航栏首个Fragment代码 适配器代码 顶部导航栏首个Fragment代码  顶部导航栏另外三个Fragment代码  ​编辑 顶部导航栏四个Fragment的XML 补充 学Android开发开始实操,第一步肯定要把大致布局搞定。做这个布局用到的知识难点有fr

    2024年02月03日
    浏览(47)
  • Android---DslTabLayout实现底部导航栏

    1. 在 Android 项目中引用 JitPack 库  AGP 8.+ 根目录的 settings.gradle  AGP 8.+ 根目录如果是  settings.gradle.kts 文件  AGP 8.- 根目录的 build.gradle 2. 添加依赖  在APP目录中的 build.gradle 3. 布局 activity_main.xml 4. 底部 tab_item.xml 布局 5. 每个底部 tab 对应的 fragment a. DiscoveryFragment b. fragment_dis

    2024年02月20日
    浏览(28)
  • Android BottomNavigation底部导航栏使用

    原文地址: Android BottomNavigation底部导航栏使用 - Stars-One的杂货小窝 本文侧重点记录一些特殊的样式设置,所以基本使用这里就简单概述一下,详细图文可以去找其他人的博文 1.创建对应的menu菜单文件 2.xml布局引用menu菜单 3.启动Activity预览效果 可以使用 setOnItemSelectedListener 方法监

    2024年02月12日
    浏览(34)
  • Android实现底部导航栏方法(Navigation篇)

    底部导航栏一直是大部分App不可缺失的一部分 最近注意到Jetpack中的Navigation支持Fragment的切换操作 特此浅研究一下 选择性跳过 此处使用Google开发者文档中介绍 使用nav文件配合 FragmentContainerView组件 实现Fragment的切换操作 创建nav文件 导入后,在项目的res文件夹下,右键选择

    2024年02月06日
    浏览(78)
  • 【Android入门到项目实战-- 11.2】—— 实现底部导航栏(RadioGroup+Fragment)

            效果如下,使用RadioGroup实现,不能左右滑动切换页面,适用于导航页里还有需要切换页面的场景,如果需要滑动效果,使用ViewPager实现。         以下示例按照图上实现,具体多少个页面,按需修改。         由于需要用到icon,提前下载好图标到drawable文件

    2024年02月10日
    浏览(65)
  • Android隐藏导航栏和状态栏的方法

    一。去除状态栏 以下是Android去除状态栏的代码示例: 1. 在Activity的onCreate()方法中添加以下代码: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 2. 在AndroidManifest.xml文件中的Activity节点中添加以下属性: android:theme=\\\"@android:style/Theme.NoTitleB

    2024年02月16日
    浏览(24)
  • 电梯导航栏的实现

    点击跳到指定位置类似于电梯导航 分析: ① 当我们滚动到 今日推荐 模块,就让电梯导航显示出来 ② 点击电梯导航页面可以滚动到相应内容区域 ③ 核心算法:因为电梯导航模块和内容区模块一一对应的 ④ 当我们点击电梯导航某个小模块,就可以拿到当前小模块的索引号

    2024年02月01日
    浏览(28)
  • Android修行手册 - 使用ViewPager2实现画廊效果

    Unity3D特效百例 案例项目实战源码 Android-Unity实战问题汇总 游戏脚本-辅助自动化 Android控件全解手册 再战Android系列 Scratch编程案例 软考全系列 Unity3D学习专栏 蓝桥系列 ChatGPT和AIGC 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、工具、素材、源码、游戏等

    2024年02月22日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包