Android底部导航栏的实现---------6种方法+底部大按钮跳转(最全集合)

现在的应用大多需要一个底部导航图来完成人性化的设置,这篇文章就来看一下比较流行的底部导航的实现:

目录:

一.BottomNavigationView+ViewPager+fragment

二.BottomNavigationBar+ViewPager(FrameLayout)+fragment

三.TabLayout+fragment+viewPager

四.FragmentTabHost+ViewPager+fragment

五.RadioGroup+Radiobutton+ViewPager+fragment

六.RadioGroup+Radiobutton+FrameLayout+fragment(实现底部栏中间大按钮跳转页面)

七.TextView+LinearLayout+FrameLayout


fragment文件

fragment布局文件就是放了一个Textview显示:

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text" />

代码:

 @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_fragment,null);
        TextView textView = view.findViewById(R.id.text);
        textView.setText(R.string.alert);
        return view;
    }
    public static Fragment newInstance(){
        AlertFragment homeFragment = new AlertFragment();
        return homeFragment;
    }

其他的fragmentt和此类似

一.BottomNavigationView+ViewPager+fragment


uGoogle 发布了专门用来实现底部导航的控件,那就是BottomNavigationView,BottomNavigationView符合Material 风格,有着炫酷的切换动画,但是5.0以上可以使用,BottomNavigationView使用较为简单:

新建一个Activity,选择BottomNavigation Activity,自动给你添加控件和代码

而BottomNavigationView 的Tab是通过menu 的方式添加的,所有看一下menu文件:

 <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_home" />

    <item
        android:id="@+id/navigation_dashboard"
        android:icon="@drawable/ic_dashboard_black_24dp"
        android:title="@string/title_dashboard" />

    <item
        android:id="@+id/navigation_notifications"
        android:icon="@drawable/ic_notifications_black_24dp"
        android:title="@string/title_notifications" />

    <item
        android:id="@+id/alert"
        android:icon="@drawable/dialog_alert_icon"
        android:title="@string/alert" />
    <item
        android:id="@+id/email"
        android:icon="@drawable/email"
        android:title="@string/email" />

Activity中的代码

 private TextView mTextMessage;

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    mTextMessage.setText(R.string.title_home);
                    return true;
                case R.id.navigation_dashboard:
                    mTextMessage.setText(R.string.title_dashboard);
                    return true;
                case R.id.navigation_notifications:
                    mTextMessage.setText(R.string.title_notifications);
                    return true;
                case R.id.alert:
                    mTextMessage.setText(R.string.alert);
                    return true;
                case R.id.email:
                    mTextMessage.setText(R.string.email);
                    return true;
            }
            return false;
        }
    };

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

        mTextMessage = (TextView) findViewById(R.id.message);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        navigation.setItemIconTintList(null);
    }

XML文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BottomNavigationViewTest">

    <TextView
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:layout_marginStart="@dimen/activity_horizontal_margin"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:text="@string/title_home"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

<fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:navGraph="@navigation/mobile_navigation"
      />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="0dp"
        android:layout_marginStart="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"

        app:menu="@menu/navigation" />

</android.support.constraint.ConstraintLayout>

BottomNavigationView使用较为简单,不需要你自己定义控件,只需要自己修改他给你定义的menu文件和回调方法

这些都是系统程序自动生成的可以直接使用,下面看加ViewPager

viewPager = (ViewPager) findViewById(R.id.viewpager);
        navView = (BottomNavigationView) findViewById(R.id.bottom_navigation);

        navView.setOnNavigationItemSelectedListener(
                new BottomNavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.item_call:
                                viewPager.setCurrentItem(0);
                                break;
                            case R.id.item_mail:
                                viewPager.setCurrentItem(1);
                                break;
                            case R.id.item_person:
                                viewPager.setCurrentItem(2);
                                break;
                        }
                        return false;
                    }
                });

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (prevMenuItem != null) {
                    prevMenuItem.setChecked(false);
                } else {
                    navView.getMenu().getItem(0).setChecked(false);
                }
                navView.getMenu().getItem(position).setChecked(true);
                prevMenuItem = bottomNavigationView.getMenu().getItem(position);

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        //滑动,如果不想滑动,取消注销就可以
//        viewPager.setOnTouchListener(new View.OnTouchListener() {
//            @Override
//            public boolean onTouch(View v, MotionEvent event) {
//                return true;
//            }
//        });

      ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        adapter.addFragment(BaseFragment.newInstance("CPC"));
        adapter.addFragment(BaseFragment.newInstance("OBU"));
     
        viewPager.setAdapter(adapter);

 

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/navigation" />

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
   android:layout_alignParentBottom="true" 
   app:itemIconTint="@drawable/navigation_selector"
   app:itemTextColor="@drawable/navigation_selector"
   app:menu="@menu/menu_bottom_navigation" />

 

二.BottomNavigationBar+ViewPager(FrameLayout)+fragment


BottomNavigationBar和BottomNavigationView都是Google公司自己退出的,名字还是如此的相似,但是我却没有找出他们的联系和区别,这就让我很迷茫了,有知道的大佬可以告告我

现在说一下它的使用

在Gradle中添加

implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.2'

布局文件(FrameLayout)

 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/framelayout"></FrameLayout>
    <com.ashokvarma.bottomnavigation.BottomNavigationBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bottombar"
        app:layout_constraintBottom_toBottomOf="parent">
    </com.ashokvarma.bottomnavigation.BottomNavigationBar>

使用FrameLayout

Activity类:

private int imageViewArray[] = {R.drawable.ic_home_black_24dp, R.drawable.ic_dashboard_black_24dp, R.drawable.ic_notifications_black_24dp, R.drawable.email, R.drawable.dialog_alert_icon};
    private String[] strings = {"Home", "DashBoard", "Notification", "Email", "Alert"};
    FragmentTransaction transaction;
    FragmentManager manager;
    BottomNavigationBar bar;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bottom_navigation_bar_test);
        bar = findViewById(R.id.bottombar);
//角标,如同QQ的红点
        final TextBadgeItem mBadgeItem = new TextBadgeItem()
                .setBorderWidth(4)
                .setAnimationDuration(200)
                .setBackgroundColorResource(R.color.red)
                .setHideOnSelect(false)
                .setText("0");


        bar.addItem(new BottomNavigationItem(imageViewArray[0], strings[0]).setActiveColorResource(R.color.black).setBadgeItem(mBadgeItem))
                .addItem(new BottomNavigationItem(imageViewArray[1], strings[1]).setActiveColorResource(R.color.colorPrimary))
                .addItem(new BottomNavigationItem(imageViewArray[2], strings[2]).setActiveColorResource(R.color.orange))
                .addItem(new BottomNavigationItem(imageViewArray[3], strings[3]).setActiveColorResource(R.color.purple))
                .addItem(new BottomNavigationItem(imageViewArray[4], strings[4]).setActiveColorResource(R.color.red))
                .setFirstSelectedPosition(0)
                .initialise();

        bar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener() {
            @Override
            public void onTabSelected(int position) {
                manager = getSupportFragmentManager();
                transaction = manager.beginTransaction();
                switch (position){

                    case 0:
                        transaction.replace(R.id.framelayout, HomeFragment.newInstance());
                        mBadgeItem.hide();

                        break;
                    case 1:
                        transaction.replace(R.id.framelayout, DashboardFragment.newInstance());
                        mBadgeItem.show();
                        break;
                    case 2:
                        transaction.replace(R.id.framelayout, NotificationFragment.newInstance());
                        break;
                    case 3:
                        transaction.replace(R.id.framelayout, EmailFragment.newInstance());
                        break;
                    case 4:
                       transaction.replace(R.id.framelayout,AlertFragment.newInstance());
                        break;
                }
                transaction.commit();
           
            }

            @Override
            public void onTabUnselected(int position) {

            }

            @Override
            public void onTabReselected(int position) {

            }
        });
//设置初始页面
        setDefaultFragment();


    }

设置初始界面

private void setDefaultFragment() {
        manager = getSupportFragmentManager();
        transaction = manager.beginTransaction();
        transaction.replace(R.id.framelayout, HomeFragment.newInstance());
        transaction.commit();
    }

使用ViewPager

布局文件

将FrameLayout改成ViewPager

<android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/viewpager">

    </android.support.v4.view.ViewPager>

Activity类

只需要将回调方法重写,以及初始化fragment和viewPager

 private List<Fragment> fragments;
    private ViewPager viewPager;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bottom_navigation_bar_test);
        bar = findViewById(R.id.bottombar);
        initPager();

        final TextBadgeItem mBadgeItem = new TextBadgeItem()
                .setBorderWidth(4)
                .setAnimationDuration(200)
                .setBackgroundColorResource(R.color.red)
                .setHideOnSelect(false)
                .setText("0");
        bar.addItem(new BottomNavigationItem(imageViewArray[0], strings[0]).setActiveColorResource(R.color.black).setBadgeItem(mBadgeItem))
                .addItem(new BottomNavigationItem(imageViewArray[1], strings[1]).setActiveColorResource(R.color.colorPrimary))
                .addItem(new BottomNavigationItem(imageViewArray[2], strings[2]).setActiveColorResource(R.color.orange))
                .addItem(new BottomNavigationItem(imageViewArray[3], strings[3]).setActiveColorResource(R.color.purple))
                .addItem(new BottomNavigationItem(imageViewArray[4], strings[4]).setActiveColorResource(R.color.red))
                .setFirstSelectedPosition(0)
                .initialise();
        bar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener() {
            @Override
            public void onTabSelected(int position) {               
                viewPager.setCurrentItem(position);
            }

            @Override
            public void onTabUnselected(int position) {

            }

            @Override
            public void onTabReselected(int position) {

            }
        });

        setDefaultFragment();


    }

    private void initPager() {
        viewPager = findViewById(R.id.viewpager);
        fragments = new ArrayList<Fragment>();
        fragments.add(HomeFragment.newInstance());
        fragments.add(DashboardFragment.newInstance());
        fragments.add(NotificationFragment.newInstance());
        fragments.add(EmailFragment.newInstance());
        fragments.add(AlertFragment.newInstance());
        viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments));
        viewPager.setCurrentItem(0);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                bar.selectTab(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

     private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
        private List<Fragment> lists;

        @Override
        public Fragment getItem(int position) {
            return lists == null ? null : lists.get(position);
        }

        @Override
        public int getCount() {
            return lists == null ? 0 : lists.size();
        }

        public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> datas) {
            super(fm);
            lists = datas;
        }

        public MyFragmentPagerAdapter() {
            super(null);
        }
    }

三.TabLayout+fragment+viewPager


要实现这样一个底部导航栏,大家最容易想到的当然就是TabLayout,Tab 切换嘛,TabLayout 就是专门干这个事的,不过TabLayout 默认是带有Indicator的,我们是不需要的,因此需要把它去掉

去掉默认的Indicator直接设置app:tabIndicatorHeight属性的值为0就行了

布局文件

<android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/viewpager"></android.support.v4.view.ViewPager>

    <android.support.design.widget.TabLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:tabIndicatorHeight="0dp"
        app:tabSelectedTextColor="@android:color/holo_red_dark"
        app:tabTextColor="@android:color/black"
        android:id="@+id/tablayout">

Activity类:

private TabLayout tabLayout;
    private List<Fragment> fragments;
    private ViewPager viewPager;
    private FragmentPagerAdapter adapter;
    private String[] strings ={"Home","DashBoard","Notification","Email","Alert"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tablayout_test);
        initView();
    }

    private void initView() {
        tabLayout = findViewById(R.id.tablayout);
        fragments = new ArrayList<Fragment>();
        fragments.add(HomeFragment.newInstance());
        fragments.add(DashboardFragment.newInstance());
        fragments.add(NotificationFragment.newInstance());
        fragments.add(EmailFragment.newInstance());
        fragments.add(AlertFragment.newInstance());
        viewPager = findViewById(R.id.viewpager);
        adapter = new TitleFragmentPagerAdapter(getSupportFragmentManager(),fragments,strings);
        viewPager.setAdapter(adapter);

        tabLayout.setupWithViewPager(viewPager);
        onTabItemSelected();
    }

    private void onTabItemSelected() {
        for (int i =0;i<tabLayout.getTabCount();i++) {
            TabLayout.Tab tab = tabLayout.getTabAt(i);
            Drawable drawable = null;
            switch (i){
                case 0:
                    drawable = getResources().getDrawable(R.drawable.ic_home_black_24dp);
                    break;

                case 1:
                    drawable = getResources().getDrawable(R.drawable.ic_dashboard_black_24dp);
                    break;
                case 2:
                    drawable = getResources().getDrawable(R.drawable.ic_notifications_black_24dp);
                    break;
                case 3:
                    drawable = getResources().getDrawable(R.drawable.email);
                    break;
                case 4:
                    drawable = getResources().getDrawable(R.drawable.dialog_alert_icon);
                    break;
            }
            tab.setIcon(drawable);
        }
    }


    private class TitleFragmentPagerAdapter extends FragmentPagerAdapter {


        private List<Fragment> mFragmentList = null;

        private String[] titles;

        public TitleFragmentPagerAdapter(FragmentManager mFragmentManager,
                                         List<Fragment> fragmentList) {
            super(mFragmentManager);
            mFragmentList = fragmentList;
        }


        public TitleFragmentPagerAdapter(FragmentManager mFragmentManager,
                                         List<Fragment> fragmentList, String[] titles) {
            super(mFragmentManager);
            mFragmentList = fragmentList;
            this.titles = titles;
        }

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


        @Override
        public Fragment getItem(int position) {

            Fragment fragment = null;
            if (position < mFragmentList.size()) {
                fragment = mFragmentList.get(position);
            } else {
                fragment = mFragmentList.get(0);
            }
            return fragment;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            if (titles != null && titles.length > 0)
                return titles[position];
            return null;
        }
    }

 

四.FragmentTabHost+ViewPager+fragment


FragmentTabHost 可能是大家实现底部导航栏用得最多的一种方式,特别是在TabLayout 和 BottomNavigation 出来之前,是比较老的实现底部导航栏的方式,同时也是使用最多的一种

布局文件

<android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/viewpager"></android.support.v4.view.ViewPager>
    <android.support.v4.app.FragmentTabHost
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@android:id/tabhost">
        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@android:id/tabcontent">

        </FrameLayout>

    </android.support.v4.app.FragmentTabHost>

Activity

 private ViewPager mViewPager;
    private List<Fragment> fragments;
    private FragmentTabHost host;
    private int imageViewArray[] = { R.drawable.ic_home_black_24dp, R.drawable.ic_dashboard_black_24dp,R.drawable.ic_notifications_black_24dp,R.drawable.email,R.drawable.dialog_alert_icon};
    private String[] strings ={"Home","DashBoard","Notification","Email","Alert"};
    private FragmentPagerAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_tab_host_test);
        initview();
    }
    private void initview(){
        mViewPager = findViewById(R.id.viewpager);
        fragments = new ArrayList<Fragment>();
        fragments.add(HomeFragment.newInstance());
        fragments.add(DashboardFragment.newInstance());
        fragments.add(NotificationFragment.newInstance());
        fragments.add(EmailFragment.newInstance());
        fragments.add(AlertFragment.newInstance());
        adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),fragments);
        mViewPager.setAdapter(adapter);
        mViewPager.addOnPageChangeListener(pageChangeListener);
        host = findViewById(android.R.id.tabhost);
        host.setup(this,getSupportFragmentManager(),R.id.viewpager);
        host.getTabWidget().setDividerDrawable(null);
        host.setOnTabChangedListener(onTabChangeListener);
        int count = strings.length;
        for (int i = 0;i<count;i++) {
            TabHost.TabSpec tabSpec = host.newTabSpec(strings[i]).setIndicator(getTabItemView(i));
            host.addTab(tabSpec,fragments.get(i).getClass(),null);
            host.setTag(i);
        }
    }
    private View getTabItemView(int i){
        View view = LayoutInflater.from(this).inflate(R.layout.layout_tab,null);
        ImageView imageView = view.findViewById(R.id.tab_imageview);
        imageView.setImageResource(imageViewArray[i]);
        TextView textView = view.findViewById(R.id.tab_textview);
        textView.setText(strings[i]);
        return view;
    }
    private TabHost.OnTabChangeListener onTabChangeListener = new TabHost.OnTabChangeListener() {
        @Override
        public void onTabChanged(String tabId) {
            int position = host.getCurrentTab();
            mViewPager.setCurrentItem(position);
        }
    };
    private ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            TabWidget widget = host.getTabWidget();
            int focusability = widget.getDescendantFocusability();
            widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
            host.setCurrentTab(position);
            widget.setDescendantFocusability(focusability);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    };

    private class  MyFragmentPagerAdapter extends FragmentPagerAdapter {
        private List<Fragment> lists;
        @Override
        public Fragment getItem(int position) {
            return lists == null?null:lists.get(position);
        }

        @Override
        public int getCount() {
            return lists == null?0:lists.size();
        }

        public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> datas){
            super(fm);
            lists = datas;
        }
        public  MyFragmentPagerAdapter(){
            super(null);
        }
    }

TabHost需要你自己定义一个布局文件来显示图片和文字

<?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:orientation="vertical">

    <ImageView
        android:id="@+id/tab_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tab_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />

</LinearLayout>

 

五.RadioGroup+Radiobutton+ViewPager+fragment

RadioGroup +RadioButtom 是做单选的 所以用RadioGroup + RadioButton 来实现底部导航栏也是一种方式。但是要去掉他的默认样式,所以自己要定义一个样式:

自定义样式

<style name="RadioGroupButtonStyle" >
        <!-- 这个属性是去掉button 默认样式-->
        <item name="android:button">@null</item>

        <item name="android:gravity">center</item>
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_weight">1</item>
        <item name="android:textSize">12sp</item>
        <item name="android:textColor">@color/black</item>
    </style>

布局文件

 <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v4.view.ViewPager>


        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:orientation="horizontal"
            app:layout_constraintBottom_toBottomOf="parent"
            android:id="@+id/radiogroup">
            <RadioButton
                android:id="@+id/radio1"
                style="@style/RadioGroupButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawableBottom="@drawable/ic_home_black_24dp"
                android:text="@string/title_home"
                android:checked="true"/>

            <RadioButton
                android:id="@+id/radio2"
                style="@style/RadioGroupButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawableBottom="@drawable/ic_dashboard_black_24dp"
                android:text="@string/title_dashboard" />

            <RadioButton
                android:id="@+id/radio3"
                style="@style/RadioGroupButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawableBottom="@drawable/ic_notifications_black_24dp"
                android:text="@string/title_notifications" />

            <RadioButton
                android:id="@+id/radio4"
                style="@style/RadioGroupButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawableBottom="@drawable/email"
                android:text="@string/email" />

            <RadioButton
                android:id="@+id/radio5"
                style="@style/RadioGroupButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawableBottom="@drawable/dialog_alert_icon"
                android:text="@string/alert" />

        </RadioGroup>

Activity类

private ViewPager mViewPager;
    private RadioGroup radioGroup;
    private List<Fragment> fragments;
    private FragmentPagerAdapter adapter;

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

    private void initview() {
        mViewPager = findViewById(R.id.viewpager);
        radioGroup = findViewById(R.id.radiogroup);
        fragments = new ArrayList<Fragment>();
        fragments.add(HomeFragment.newInstance());
        fragments.add(DashboardFragment.newInstance());
        fragments.add(NotificationFragment.newInstance());
        fragments.add(EmailFragment.newInstance());
        fragments.add(AlertFragment.newInstance());
        adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments);
        mViewPager.setAdapter(adapter);
        mViewPager.addOnPageChangeListener(pageChangeListener);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                for (int i = 0; i < group.getChildCount(); i++) {
                    if (group.getChildAt(i).getId() == checkedId) {
                        mViewPager.setCurrentItem(i);
                        return;
                    }
                }

            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mViewPager.removeOnPageChangeListener(pageChangeListener);
    }

    private ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            if (radioGroup.getChildAt(position) instanceof RadioButton) {
                RadioButton radioButton = (RadioButton) radioGroup.getChildAt(position);
                radioButton.setChecked(true);
            } else {

            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    };

    private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
        private List<Fragment> lists;

        @Override
        public Fragment getItem(int position) {
            return lists == null ? null : lists.get(position);
        }

        @Override
        public int getCount() {
            return lists == null ? 0 : lists.size();
        }

        public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> datas) {
            super(fm);
            lists = datas;
        }

        public MyFragmentPagerAdapter() {
            super(null);
        }
    }

 

六.RadioGroup+Radiobutton+FrameLayout+fragment(实现底部栏中间大按钮跳转页面)

和第5个类似,但是在radiogroup添加一个view占格,然后创建个imageview覆盖view

布局文件

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fragment_container"></FrameLayout>


    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        android:id="@+id/radiogroup">
        <RadioButton
            android:id="@+id/radio1"
            style="@style/RadioGroupButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableBottom="@drawable/ic_home_black_24dp"
            android:text="@string/title_home"
            android:checked="true"/>

        <RadioButton
            android:id="@+id/radio2"
            style="@style/RadioGroupButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableBottom="@drawable/ic_dashboard_black_24dp"
            android:text="@string/title_dashboard" />

        <View style="@style/RadioGroupButtonStyle"
            android:id="@+id/view"></View>

        <RadioButton
            android:id="@+id/radio3"
            style="@style/RadioGroupButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableBottom="@drawable/ic_notifications_black_24dp"
            android:text="@string/title_notifications" />

        <RadioButton
            android:id="@+id/radio5"
            style="@style/RadioGroupButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableBottom="@drawable/dialog_alert_icon"
            android:text="@string/alert" />

    </RadioGroup>
    <ImageView
        android:layout_width="70dp"
        android:layout_height="70dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:src="@drawable/email"
        android:id="@+id/imageview"/>

Activity


    private RadioGroup radioGroup;
    private SparseArray<Fragment> fragments;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intent_test);
        initview();
    }
    private void initview(){
        radioGroup = findViewById(R.id.radiogroup);
        fragments = new SparseArray<Fragment>() {};
        fragments.append(R.id.radio1, HomeFragment.newInstance());
        fragments.append(R.id.radio2, DashboardFragment.newInstance());
        fragments.append(R.id.radio3, NotificationFragment.newInstance());
        fragments.append(R.id.radio5, AlertFragment.newInstance());
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        fragments.get(checkedId)).commit();
            }
        });
        getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,
                fragments.get(R.id.radio1)).commit();
        ImageView imageView = findViewById(R.id.imageview);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(IntentTest.this,TabLayoutTest.class));
            }
        });
    }

这个我viewpager没有实现出来,所以就是抄的别人的(小小的吐槽一下)

第二个方法

在布局文件的根节点添加:

android:clipChildren="false"

clipChildren这个属性是在容器里面限制子控件能不能越界绘制,默认是true,也是可以实现底部中间大按钮的,此处就不给代码,诸位可以试试

七.TextView+LinearLayout+FrameLayout

此方法就是自己一个个定义TextView和Imageview来显示

这篇文章讲可以参考:https://blog.csdn.net/student9128/article/details/53463355

总结

本文总结了实现底部导航栏的6种方式,其中TabLayout 和,BottomNavigationView和BottomNavigationBar 是Android 5.0 以后添加的新控件,符合Material 设计规范,如果是Materail 风格的,可以考虑用这两种实现

还有就是知道BottomNavigationView和BottomNavigationBar 区别和联系的大佬可以告我一下的

demo


这是demo,需要的可以看一下

  • 26
    点赞
  • 239
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,react-marknavbar和Anchor都是React组件,可以一起使用来实现页面内的导航栏和锚点跳转。 首先,您需要安装这两个组件,可以使用npm或yarn进行安装。例如,使用npm安装: ``` npm install react-marknavbar anchor-js ``` 安装完成后,您可以在React项目中引入这两个组件: ```javascript import React from 'react'; import { MarkNav, Anchor } from 'react-marknavbar'; import 'anchor-js'; const App = () => { return ( <div> <MarkNav> <Anchor href="#section1">Section 1</Anchor> <Anchor href="#section2">Section 2</Anchor> <Anchor href="#section3">Section 3</Anchor> </MarkNav> <div id="section1"> <h2>Section 1</h2> <p>Content for section 1 goes here.</p> </div> <div id="section2"> <h2>Section 2</h2> <p>Content for section 2 goes here.</p> </div> <div id="section3"> <h2>Section 3</h2> <<p>Content for section 3 goes here.</p> </div> </div> ); }; export default App; ``` 在上面的代码中,我们首先引入了MarkNav和Anchor组件,然后使用MarkNav组件包裹了几个Anchor组件,这些Anchor组件分别对应页面中的几个锚点。在每个锚点的href属性中,我们使用了类似于#section1的语法来指定跳转的目标位置。最后,我们在页面中添加了几个div元素,这些元素分别对应了不同的锚点位置。 当用户在页面上点击导航栏中的链接时,页面会自动滚动到对应的锚点位置。这一过程是通过Anchor组件中的anchor-js库来实现的。如果您需要更多关于这些组件的信息,可以参考官方文档或者相关的开发社区。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值