Android底部导航栏BottomNavigationView

 

 

fragment_first

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".FirstFragment">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is the first Fragment"
        android:background="@android:color/holo_blue_light"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:padding="4dp"
        android:textAllCaps="false"
        android:layout_centerInParent="true" />

</RelativeLayout>

 FirstFragment

package com.etime.myproject;

import android.content.Context;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

public class FirstFragment extends Fragment {
    private Button mButton;
    private Context mContext;

    public FirstFragment() {

    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 依据Fragment布局文件生成其对应View
        View view=inflater.inflate(R.layout.fragment_first, container, false);
        // 从View中找到Button
        mButton=(Button)view.findViewById(R.id.button);
        // 为Button设置点击事件
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mContext=getContext();
                Toast.makeText(mContext,"Hello Fragment",Toast.LENGTH_LONG).show();
            }
        });
        //返回FragView的View
        return view;
    }
}

fragment_second.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".FirstFragment">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is the second Fragment"
        android:background="@android:color/holo_blue_light"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:padding="4dp"
        android:textAllCaps="false"
        android:layout_centerInParent="true" />

</RelativeLayout>

SecondFragment 

package com.etime.myproject;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
import androidx.fragment.app.Fragment;

public class SecondFragment extends Fragment {
    private Button mButton;
    private Context mContext;

    public SecondFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 依据Fragment布局文件生成其对应View
        View view=inflater.inflate(R.layout.fragment_second, container, false);
        // 从View中找到Button
        mButton=(Button)view.findViewById(R.id.button);
        // 为Button设置点击事件
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mContext=getContext();
                Toast.makeText(mContext,"Hello Fragment",Toast.LENGTH_LONG).show();
            }
        });
        //返回FragView的View
        return view;
    }
}

fragment_third.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".ThirdFragment">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is the third Fragment"
        android:background="@android:color/holo_blue_light"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:padding="4dp"
        android:textAllCaps="false"
        android:layout_centerInParent="true" />

</RelativeLayout>

ThirdFragment 

package com.etime.myproject;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
import androidx.fragment.app.Fragment;

public class ThirdFragment extends Fragment {
    private Button mButton;
    private Context mContext;

    public ThirdFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 依据Fragment布局文件生成其对应View
        View view=inflater.inflate(R.layout.fragment_third, container, false);
        // 从View中找到Button
        mButton=(Button)view.findViewById(R.id.button);
        // 为Button设置点击事件
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mContext=getContext();
                Toast.makeText(mContext,"Hello Fragment",Toast.LENGTH_LONG).show();
            }
        });
        //返回FragView的View
        return view;
    }
}

build.gradle

implementation 'com.google.android.material:material:1.0.0'

 

menu_bottom_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/tab_home"
        android:icon="@drawable/tab_home"
        android:title="首页"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/tab_device"
        android:icon="@drawable/tab_device"
        android:title="设备"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/tab_setting"
        android:icon="@drawable/tab_setting"
        android:title="设置"
        app:showAsAction="ifRoom" />
</menu>

 selector_bnv_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#0acacb" android:state_checked="true" />
    <item android:color="#ffffff" android:state_checked="false" />
</selector>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 根布局采用LinearLayout -->
<!-- android:orientation="vertical" -->
<!-- android:background="@drawable/background" -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/background"
    >
   <!-- ViewPager的高为0 -->
   <!-- android:layout_weight="1" -->
   <androidx.viewpager.widget.ViewPager
       android:id="@+id/viewPager"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="1"
       />

   <!-- app:menu="@menu/menu_bottom_tab" 指定底部tab -->
   <!-- app:itemIconTint和itemTextColor  设置切换效果-->
   <com.google.android.material.bottomnavigation.BottomNavigationView
       android:id="@+id/bottomNavigationView"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       app:itemIconTint="@drawable/selector_bnv_color"
       app:itemTextColor="@drawable/selector_bnv_color"
       app:menu="@menu/menu_bottom_tab"/>

</LinearLayout>

MainActivity
package com.etime.myproject;

import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.bottomnavigation.BottomNavigationView;

/**
 * 注意事项:
 * 1、MainActivity继承自AppCompatActivity
 * 2、与ViewPager相关的东西均在androidx包下
 * 3、添加依赖 implementation 'com.google.android.material:material:1.0.0'
 *    否则无法使用BottomNavigationView
 */
public class MainActivity extends AppCompatActivity {
    private ViewPager mViewPager;
    private Context mContext;
    private BottomNavigationView mBottomNavigationView;
    private NavigationItemSelectedListenerImpl mNavigationItemSelectedListenerImpl;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    public void init(){
        mContext=this;
        mViewPager=(ViewPager) findViewById(R.id.viewPager);
        FragmentManager fragmentManager=getSupportFragmentManager();
        //设置ViewPager的Adapter
        ViewPagerAdapter adapter=new ViewPagerAdapter(fragmentManager,FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        mViewPager.setAdapter(adapter);
        //设置ViewPager的翻页监听器
        PageChangeListenerImpl listener=new PageChangeListenerImpl();
        mViewPager.addOnPageChangeListener(listener);

        //设置BottomNavigationView导航监听
        mBottomNavigationView=findViewById(R.id.bottomNavigationView);
        mNavigationItemSelectedListenerImpl=new NavigationItemSelectedListenerImpl();
        mBottomNavigationView.setOnNavigationItemSelectedListener(mNavigationItemSelectedListenerImpl);
    }

    //ViewPager适配器ViewPagerAdapter
    private  class ViewPagerAdapter extends FragmentPagerAdapter{
        FirstFragment firstFragment=new FirstFragment();
        SecondFragment secondFragment=new SecondFragment();
        ThirdFragment thirdFragment=new ThirdFragment();
        private Fragment[] fragments = new Fragment[]{firstFragment,secondFragment,thirdFragment};

        public ViewPagerAdapter(@NonNull FragmentManager fm, int behavior) {
            super(fm, behavior);
        }

        @NonNull
        @Override
        public Fragment getItem(int position) {
            return fragments[position];
        }

        @Override
        public int getCount() {
            return fragments.length;
        }
    }

    //ViewPager翻页监听器ViewPager.OnPageChangeListener
    private class PageChangeListenerImpl implements ViewPager.OnPageChangeListener{
        @Override
        public void onPageScrolled(int i, float v, int i1) {

        }

        @Override
        public void onPageSelected(int position) {
            //切换BottomNavigationView相应位置的item的选中状态
            Menu menu=mBottomNavigationView.getMenu();
            MenuItem menuItem = menu.getItem(position);
            menuItem.setChecked(true);
        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    }

    //BottomNavigationView导航监听BottomNavigationView.OnNavigationItemSelectedListener
    private class NavigationItemSelectedListenerImpl implements BottomNavigationView.OnNavigationItemSelectedListener{
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            int itemId = item.getItemId();
            //切换ViewPager的页面
            switch (itemId){
                case R.id.tab_home:
                    mViewPager.setCurrentItem(0);
                    break;
                case R.id.tab_device:
                    mViewPager.setCurrentItem(1);
                    break;
                case R.id.tab_setting:
                    mViewPager.setCurrentItem(2);
                    break;
            }
            return false;
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值