Android---DslTabLayout实现底部导航栏

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

Android---DslTabLayout实现底部导航栏,# Android第三方库,android,kotlin

1. 在 Android 项目中引用 JitPack 库

 AGP 8.+ 根目录的 settings.gradle

dependencyResolutionManagement {
    ...
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

 AGP 8.+ 根目录如果是  settings.gradle.kts 文件

dependencyResolutionManagement {
    ...
    repositories {
        ...
        maven { url = uri("https://jitpack.io") }
    }
}

 AGP 8.- 根目录的 build.gradle

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

2. 添加依赖

 在APP目录中的 build.gradle

implementation("com.github.angcyo.DslTablayout:TabLayout:3.5.3")
implementation("com.github.angcyo.DslTablayout:ViewPager2Delegate:3.5.3")

3. 布局 activity_main.xml

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

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#D5D6D6"/>

    <!-- app:tab_default_index="0" 默认选中第 0 个 tab,默认选中的索引值-->
    <!-- app:tab_item_is_equ_width="true" 让所有的 tab 平分宽度,Item等宽-->
    <!-- app:tab_select_color="#DD0000" 选中当前 tab 时,tab 里文本的颜色 -->
    <!-- app:tab_text_view_id="@id/content" 要放入的 TextView 的 id, 
    为 tab_item.xml 里的 id 为 content 的TextView -->
    <com.angcyo.tablayout.DslTabLayout
        android:id="@+id/dsl_tab_layout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:tab_default_index="0"
        app:tab_convex_background="@color/white"
        app:tab_item_is_equ_width="true"
        app:tab_select_color="#DD0000"
        app:tab_text_view_id="@id/content"
        />
</LinearLayout>

4. 底部 tab_item.xml 布局

<?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="wrap_content"
    android:orientation="vertical"
    android:gravity="center">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="23dp"
        android:layout_height="23dp"
        android:src="@drawable/selector_tab_video"/>

    <TextView
        android:id="@+id/content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="12sp"
        android:text="发现"/>

</LinearLayout>

5. 每个底部 tab 对应的 fragment

a. DiscoveryFragment

class DiscoveryFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_discovery, container, false)
    }

    companion object {
        fun newInstance(): DiscoveryFragment{
            val args = Bundle()

            val fragment = DiscoveryFragment()
            fragment.arguments = args
            return fragment
        }
    }
}

b. fragment_discovery.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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=".fragment.DiscoveryFragment">

   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="25sp"
       android:text="发现界面"
       android:layout_gravity="center"/>

</FrameLayout>

 其它三个 Fragment(VideoFragment,CategoryFragment,MeFragment)类似。

6. Adapter

class BottomTabAdapter(fragmentActivity : FragmentActivity, private val count : Int)
    : FragmentStateAdapter(fragmentActivity) {
    override fun getItemCount(): Int {
        return count
    }

    /**
     * position 是每个 Fragment 对应的下标
     */
    override fun createFragment(position: Int): Fragment {
        return when(position){
            0 -> DiscoveryFragment.newInstance()
            1 -> VideoFragment.newInstance()
            2 -> CategoryFragment.newInstance()
            else -> MeFragment.newInstance()
        }
    }
}

7. MainActivity.kt。填充Fragment 和 TabLayout,实现底部导航

在APP目录中的 build.gradle 的 android 下添加 ViewBinding 的使用

android {
    
    ...
    viewBinding{
        enable=true
    }
}
class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // TODO 1初始化底部按钮(tab_item)并添加到 dslTabLayout
        for (i in bottomItemTitle.indices){
            //TODO TabItemBinding.inflate(layoutInflater)) 通过 ViewBinding 的方式,拿到 tab_item.xml 布局
            TabItemBinding.inflate(layoutInflater).apply {
                content.text = bottomItemTitle[i]
                icon.setImageResource(bottomItemIcon[i])

                // 将当前添加了 icon 和 content 的 tab_item 添加到 TabLayout 中
                binding.dslTabLayout.addView(root)
            }
        }

        // TODO 2ViewPager + Fragment
        binding.viewPager.offscreenPageLimit = bottomItemTitle.size
        binding.viewPager.adapter = BottomTabAdapter(this, bottomItemTitle.size)

        // TODO 3将 ViewPager 中的 Fragment 与 底部的 Tab 绑定
        ViewPager2Delegate.install(binding.viewPager, binding.dslTabLayout, false)
    }

    companion object{
        // TODO 底部 item 的标题
        private val bottomItemTitle = listOf(
            "发现",
            "视频",
            "分类",
            "我的"
        )
        // TODO 底部 item 的图标
        private val bottomItemIcon = listOf(
            R.drawable.selector_tab_discovery,
            R.drawable.selector_tab_video,
            R.drawable.selector_tab_category,
            R.drawable.selector_tab_me
        )
    }
}

完整项目

链接 DslTabLayout+ViewPager2+Fragment 实现底部导航栏
提取码:ei9o

如果向想通过Android原生的 BottomNavigationView+Viewpager2+Fragment 实现底部导航栏,可以看这一篇帖子 Android---简易的底部导航栏

DslDslTabLayout 官网 : https://github.com/angcyo/DslTabLayout文章来源地址https://www.toymoban.com/news/detail-830418.html

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

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

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

相关文章

  • Android平台如何实现第三方模块编码后(H.264/H.265/AAC/PCMA/PCMU)数据实时预览播放

    技术诉求 我们在做GB28181设备对接模块和RTMP直播推送模块的时候,遇到这样的技术需求,设备(如执法记录仪)侧除了采集传统的摄像头外,还需要对接比如大疆等第三方数据源,确保按照GB28181规范和RTMP协议规范,接入到国标平台侧和RTMP服务,除了正常的接入需求外,还需

    2024年02月16日
    浏览(35)
  • Android Pdf第三方框架

    导入AndroidPdfViewer 在 repositories 里面添加库 布局文件引用PDFView PdfViewer 为我们提供了以下几种读取文件的方法: Configurator 主要方法 PDFView 其他方法 github地址: https://github.com/barteksc/AndroidPdfViewer 导入mupdf 在 repositories 里面添加库 mupdf提供了解析代码, Document 读取pdf文件, Androi

    2024年02月13日
    浏览(65)
  • Android 解决第三方库版本冲突

    在开发游戏SDK时会使用一些第三方库,例如上文提到的 OkHttp ,或者集成某些第三方,而这些第三方使用的系统库(例如 supportv7)和项目组使用的版本不一致,在编译时就会出现版本冲突问题。解决办法有两个: 尽量不使用第三库,例如针对 OkHttp ,如果没有特殊的需求(比

    2023年04月27日
    浏览(111)
  • Android Studio查看第三方库依赖树

    在Android开发过程中,我们或多或少都会引入第三方库,引入的库越多,越容易产生库之间的依赖冲突,所以我们今天一起来了解Android Studio查看第三方库依赖树。 下面就拿我遇到的问题还原一下: 之前接人容联客服系统的时候,集成完成后进入客服页面发生闪退,我们回顾

    2024年02月08日
    浏览(51)
  • Android Studio引用第三方库的方式

    title: 大小端详解 date: 2023-06-06 21:01:24 comments: true #是否可评论 toc: true #是否显示文章目录 categories: #分类 - gradle - android studio tags: #标签 - gradle - android studio summary: android stduio 导入第三方库方式 这里描述的第三方库文件格式指的是 so aar so库介绍一种方法 Aar介绍两种方法 libs目录

    2024年02月08日
    浏览(55)
  • Android Studio连接使用第三方模拟器

           使用Android Studio自带的模拟器,第一会比较卡,第二配置容易出错,第三,自带的模拟器很吃电脑配置。如果电脑配置较差,会比较耽误事。所以为例解决上面三个问题,可以在电脑上按照第三方手机模拟器,例如:夜神模拟器、雷电模拟器、MUMU模拟器等等,不管是

    2024年01月15日
    浏览(46)
  • 【Android Studio】第三方库 图表(MPAndroidChart)使用

    项目目录-app-build.gradle 项目目录-app-setting.gradle ​ 该类是图表的控件,类似于按键、图片,是从 xml 文件中通过 id 获取到的。 获取/创建 常用方法 方法名 描述 chart.setDrawBorders( boolean ) 是否显示图表边界,true:显示,默认 false chart.setScaleEnabled( boolean ) 是否使能缩放,true:使

    2024年02月06日
    浏览(59)
  • Android常用的第三方库--.jar、.aar

    JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文 件。JAR是 Java 的一种文档格式,是一种与平台无关的文件格式,可将多个文件合成一个文件。只包含了class文件与清单文件 , 不包含资源文件,如图片等所有res中的文件 。 JAR的优

    2024年02月03日
    浏览(45)
  • Android 项目调用第三方库so动态库

    在Android NDK开发中,可以通过自己编写C/C++代码来构建so动态库进行调用之外,还可以把so动态库提供给第三方使用;接下来,我将介绍在新创建的Android 项目(或已存在的Android 项目)中如何调用第三方so动态库。 关于如何进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用

    2024年02月16日
    浏览(40)
  • 【Android 12 AOSP学习】Android内置第三方apk到系统

    这篇文章将介绍如何在Android系统中内置第三方apk 编译好的Android源码 Android apk文件:也就是安卓应用安装包 (1)在源码 packages/apps 目录下以我们需要内置的APK名字来创建一个新的文件夹 以 qqmusic.apk 为例,在 Android_12_AOSP/packages/apps 目录下新建qqmusic文件夹 (2)将 qqmusic.apk 放入

    2024年02月02日
    浏览(60)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包