【Android入门到项目实战-- 11.2】—— 实现底部导航栏(RadioGroup+Fragment)

这篇具有很好参考价值的文章主要介绍了【Android入门到项目实战-- 11.2】—— 实现底部导航栏(RadioGroup+Fragment)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果

        效果如下,使用RadioGroup实现,不能左右滑动切换页面,适用于导航页里还有需要切换页面的场景,如果需要滑动效果,使用ViewPager实现。

【Android入门到项目实战-- 11.2】—— 实现底部导航栏(RadioGroup+Fragment)

 准备工作

        以下示例按照图上实现,具体多少个页面,按需修改。

        由于需要用到icon,提前下载好图标到drawable文件。

【Android入门到项目实战-- 11.2】—— 实现底部导航栏(RadioGroup+Fragment)

        提前定义好样式

        在values文件下新建styles.xml,用作fragment的布局样式,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="fragment">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:padding">5dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">@drawable/rb_text_color</item>
        <item name="android:textSize">10dp</item>
        <item name="android:textStyle">normal</item>
    </style>

</resources>

        首页的选择图标样式,在drawable文件下新建rb_home_selector.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/home2" android:state_selected="true" />
    <item android:drawable="@drawable/home" />
</selector>

        个人页面图标,drawable下新建rb_mine_selector.xml,如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/mine2" android:state_selected="true" />
    <item android:drawable="@drawable/mine" />
</selector>

         选择页面时的字体样式,drawable下新建rb_text_color.xml,如下;

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="#1296db"/>
    <item android:color="#808080"/>
</selector>

使用replace方法代码实现

        什么是replace方法,使用replace方法,当切换碎片时,当前碎片会销毁,下次切换回来时再重新创建,适用于只使用一次碎片的场景。

activity_main.xml代码如下:

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

    <FrameLayout
        android:id="@+id/fragment_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        />

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/rg_group"
        android:layout_alignParentBottom="true"
        android:background="#ffff"
        android:orientation="horizontal"
        >
        <RadioButton
            android:id="@+id/rb_home"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            style="@style/fragment"
            android:drawableTop="@drawable/rb_home_selector"
            android:text="首页"
            />
        <RadioButton
            android:id="@+id/rb_mine"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            style="@style/fragment"
            android:drawableTop="@drawable/rb_mine_selector"
            android:text="我的"
            />
    </RadioGroup>
</RelativeLayout>

MainActivity类如下:

public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {

    private RadioButton rb_home,rb_mine;
    private RadioGroup rg_group;
    private List<Fragment> fragments;
    private int position=0;
    private static final String TAG = "MainActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.getSupportActionBar().hide();//去除标题栏

        rb_home=findViewById(R.id.rb_home);
        rb_mine=findViewById(R.id.rb_mine);
        rg_group=findViewById(R.id.rg_group);

        //默认选中第一个
        rb_home.setSelected(true);

        rg_group.setOnCheckedChangeListener(this);

        //初始化fragment
        initFragment();

        //默认布局,选第一个
        defaultFragment();
    }

    private void defaultFragment() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.fragment_layout,fragments.get(0));
        transaction.commit();
    }

    private void setSelected() {
        rb_home.setSelected(false);
        rb_mine.setSelected(false);
    }

    private void initFragment() {
        fragments = new ArrayList<>();
        fragments.add(0,new homeFragment());
        fragments.add(1,new mineFragment());
    }

    @Override
    public void onCheckedChanged(RadioGroup group, int i) {
        //获取fragment管理类对象
        FragmentManager fragmentManager = getSupportFragmentManager();
        //拿到fragmentManager的触发器
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        switch (i) {
            case R.id.rb_home:
                position = 0;
                //调用replace方法,将fragment,替换到fragment_layout这个id所在UI,或者这个控件上面来
                //这是创建replace这个事件,如果想要这个事件执行,需要把这个事件提交给触发器
                //用commit()方法
                transaction.replace(R.id.fragment_layout, fragments.get(0));
                //将所有导航栏设成默认色
                setSelected();
                rb_home.setSelected(true);
                break;
            case R.id.rb_mine:
                position = 1;
                transaction.replace(R.id.fragment_layout, fragments.get(1));
                //将所有导航栏设成默认色
                setSelected();
                rb_mine.setSelected(true);
                break;
        }
        //事件的提交
        transaction.commit();
    }

}

        如下图操作新建fragment类,一起创建xml文件

【Android入门到项目实战-- 11.2】—— 实现底部导航栏(RadioGroup+Fragment)

         homeFragment.java代码:这个类写页面的具体逻辑

public class homeFragment extends Fragment {

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

        mineFragment类和上面一样,略。

        fragment_home.xml和fragment_mine.xml里按需写页面的布局就可以了。

完成。

使用add和hide方法

        通过add、hide、show方法显示隐藏碎片,当下次切换回当前碎片时,不会重新创建碎片,适用于多次使用碎片的场景,比如导航栏。

        布局和上面方法的布局一样。

        只修改MainActivity类:

        先判断有没有添加碎片,如果没有则添加碎片(注意需要判断,重复添加会报错),隐藏所有的碎片,再展示当前选择的碎片。文章来源地址https://www.toymoban.com/news/detail-498734.html

public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {

    private RadioButton rb_home,rb_schedule,rb_circle,rb_rank,rb_mine;
    private RadioGroup rg_group;
    private List<Fragment> fragments;
    private int position=0;
    private static final String TAG = "MainActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setStatusBar();//设置状态栏和标题栏

        rb_home=findViewById(R.id.rb_home);
        rb_schedule=findViewById(R.id.rb_schedule);
        rb_circle=findViewById(R.id.rb_circle);
        rb_rank=findViewById(R.id.rb_rank);
        rb_mine=findViewById(R.id.rb_mine);
        rg_group=findViewById(R.id.rg_group);

        //默认选中第一个
        rb_home.setSelected(true);

        rg_group.setOnCheckedChangeListener(this);

        //初始化fragment
        initFragment();

        //默认布局,选第一个
        defaultFragment();
    }

    private void defaultFragment() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(R.id.fragment_layout,fragments.get(0));
        transaction.commit();

    }

    private void setSelected() {
        rb_home.setSelected(false);
        rb_schedule.setSelected(false);
        rb_circle.setSelected(false);
        rb_rank.setSelected(false);
        rb_mine.setSelected(false);
    }

    private void initFragment() {
        fragments = new ArrayList<>();
        fragments.add(0,new HomeFragment());
        fragments.add(1,new ScheduleFragment());
        fragments.add(2,new CircleFragment());
        fragments.add(3,new RankFragment());
        fragments.add(4,new MineFragment());
    }

    @Override
    public void onCheckedChanged(RadioGroup group, int i) {
        //获取fragment管理类对象
        FragmentManager fragmentManager = getSupportFragmentManager();
        //拿到fragmentManager的触发器
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        switch (i) {
            case R.id.rb_home:
                position = 0;
//                transaction.replace(R.id.fragment_layout, fragments.get(0));
                if(!fragments.get(0).isAdded())
                    transaction.add(R.id.fragment_layout,fragments.get(0));
                hideFragment(transaction);
                transaction.show(fragments.get(0));
                //将所有导航栏设成默认色
                setSelected();
                rb_home.setSelected(true);
                break;
            case R.id.rb_schedule:
                position = 1;
                if(!fragments.get(1).isAdded())
                    transaction.add(R.id.fragment_layout,fragments.get(1));
                hideFragment(transaction);
                transaction.show(fragments.get(1));
                //将所有导航栏设成默认色
                setSelected();
                rb_schedule.setSelected(true);
                break;
            case R.id.rb_circle:
                position = 2;
                if(!fragments.get(2).isAdded())
                    transaction.add(R.id.fragment_layout,fragments.get(2));
                hideFragment(transaction);
                transaction.show(fragments.get(2));
                //将所有导航栏设成默认色
                setSelected();
                rb_circle.setSelected(true);
                break;
            case R.id.rb_rank:
                position = 3;
                if(!fragments.get(3).isAdded())
                    transaction.add(R.id.fragment_layout,fragments.get(3));
                hideFragment(transaction);
                transaction.show(fragments.get(3));
                //将所有导航栏设成默认色
                setSelected();
                rb_rank.setSelected(true);
                break;
            case R.id.rb_mine:
                position = 4;
                if(!fragments.get(4).isAdded())
                    transaction.add(R.id.fragment_layout,fragments.get(4));
                hideFragment(transaction);
                transaction.show(fragments.get(4));
                //将所有导航栏设成默认色
                setSelected();
                rb_mine.setSelected(true);
                break;
        }
        //事件的提交
        transaction.commit();
    }

    private void hideFragment(FragmentTransaction transaction){
        if(fragments.get(0) != null){
            transaction.hide(fragments.get(0));
        }
        if(fragments.get(1) != null){
            transaction.hide(fragments.get(1));
        }
        if(fragments.get(2) != null) {
            transaction.hide(fragments.get(2));
        }
        if(fragments.get(3) != null){
            transaction.hide(fragments.get(3));
        }
        if(fragments.get(4) != null){
            transaction.hide(fragments.get(4));
        }
    }

}

到了这里,关于【Android入门到项目实战-- 11.2】—— 实现底部导航栏(RadioGroup+Fragment)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • uni-app 经验分享,从入门到离职(二)—— tabBar 底部导航栏实战基础篇

    这篇文章的内容主题是关于小程序的 tabBar 底部导航栏的入门使用和实战技巧。通过上一篇文章的基础,我们继续对 uni-app 进行更深一步的了解和学习,以上一篇文章创建的项目为例子,我们在这个项目的基础上进行改动和学习小程序的 tabBar 内容。 本篇文章是我的 uni-app 专

    2024年02月11日
    浏览(53)
  • Android Jetpack Compose之底部导航栏的实现

    写过一段Android jetpack compose 界面的小伙伴应该都用过Compose的脚手架 Scaffold ,利用它我们可以很快的实现一个现代APP的主流界面架构,即一个带顶部导航栏和底部导航栏的界面架构,我们基于这个架构可以快速的搭建出我们想要的页面效果。而今天的文章就是要介绍如何实现

    2024年03月23日
    浏览(52)
  • android : 底部导航栏的实现(使用ViewPager和BottomNavigationView)

      本案例中需要用的控件ViewPager和BottomNavigationView ViewPager:主要是页面的切换 Fragment:碎片(也就是每个页面的内容) BottomNavigationView:底部导航栏 非常简单,主要就是一个Viewpager和BottomNavigationView 先来说一下思路:BottomNavigationView底部导航栏   ViewPager+Fragment页面        

    2024年02月03日
    浏览(42)
  • android 关于TabLayout联动ViewPager2 实现底部导航栏

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

    2024年01月25日
    浏览(43)
  • 【Android入门到项目实战-- 11.4】—— ExoPlayer视频播放器框架的详细使用

    目录 什么是ExoPlayer 一、基本使用  1、添加依赖项  2、布局 3、Activity 二、自定义播放暂停 1、首先如何隐藏默认的开始暂停和快进? 2、自定义 三、控制视频画面旋转和比例调整 四、全屏放大和缩小 1、双击视频放大缩小 2、按钮放大缩小 五、完整的实现代码 XML Activity   

    2024年02月11日
    浏览(57)
  • Android studio中使用ViewPager和BottomNavigationView实现底部导航栏和碎片的同步切换

    通过几次的踩雷和摸索,完成了以上的操作,本教程写的详细全面,包教包会,对新手有好,看了不会的联系我,我倒立洗头给你看。 所需控件: fragment 作为Android中最常用的控件,它有自己的声明周期,可以粗略地等比为能够分屏的activity,但是和activity有区别,fragment有自

    2024年02月08日
    浏览(49)
  • android中实现底部导航栏

            底部导航栏在app应用中是十分常见了,大部分的安卓应用中也都实现了底部导航栏的功能,这里我就以我以前做的一个简单小说阅读软件为例,为大家演示一下底部导航栏的使用,需要的朋友直接复制代码过去改写就行了。         这里包含了一些进行操作实际

    2024年02月19日
    浏览(47)
  • Android底部导航栏之BottomNavigationView

    1,首先需要添加依赖: implementation \\\'com.google.android.material:material:1.1.0\\\' 2,布局文件中引入: 3,常用属性: app:itemTextColor 文字的颜色,可以通过 selector 来控制选中和未选中的颜色 app:itemIconTint 图标的颜色,可以通过 selector 来控制选中和未选中的颜色 app:itemIconSize 图标大小,

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

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

    2024年02月12日
    浏览(53)
  • Flutter写一个android底部导航栏框架

    废话不多说,上代码: 在上述示例中,我们创建了一个 MyHomePage 小部件,它是 StatefulWidget 。 MyHomePage 包含底部导航栏和相关页面内容。通过 BottomNavigationBar 和 currentIndex 属性,我们可以控制当前选中的导航项并在 onTap 回调中更新状态。 在 items 属性中,我们设置了三个 Bott

    2024年02月14日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包