【问题标题】:Put Tabs inside a Fragment of the BottomNavigationView将选项卡放在 BottomNavigationView 的片段中
【发布时间】:2018-05-19 13:40:12
【问题描述】:

所以我构建了一个应用,其中包含一个带有 4 个不同片段和 4 个不同布局的 BottomNavView。 (主页、书单、最近和下载)

现在我想在第一个 Fragment(即 HomeFragment)中放置 3 个 Tab。我找到了很多关于如何在 AppCompatActivity 中实现 Tabs 的教程,但我想做的是将它们放在 HomeFragment 中。

代码: 目前,我在 activity_main.xml 中有我的 BottomNavView 和 4 个片段(主页、书单、最近、下载)。 然后,我为标签制作了 3 个片段(ForYou、All、New)。

这里是所有文件的 GitHub 链接:https://github.com/Oribakun/tabs-inside-fragment-test

这是我的 fragment_home.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >



    <android.support.design.widget.TabLayout
        android:id="@+id/tabs_home"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:tabTextColor="#fff"
        app:tabBackground="?attr/selectableItemBackground"
        app:tabGravity="fill"
        app:tabSelectedTextColor="@android:color/white"
        app:tabMode="fixed"

        />

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager_home"
        android:layout_width="match_parent"
        android:layout_height="0dp"

        />


</android.support.design.widget.CoordinatorLayout>

这就是我的 HomeFragment 的样子: 我认为这可行,但在第 46 行和第 48 行悬停 firstViewPager 和 tabLayout 时出现错误“无法重新分配 Val”。

package fragment

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.mangami.mangami.*
import android.support.design.widget.TabLayout
import android.support.v4.view.ViewPager


class HomeFragment : Fragment() {

    private val tabLayout: TabLayout? = null
    private val firstViewPager: ViewPager? = null



    /**
     * Initialize newInstance for passing parameters
     */
    companion object {
        fun newInstance(): HomeFragment {
            val fragmentHome = HomeFragment()
            val args = Bundle()
            fragmentHome.arguments = args
            return fragmentHome
        }

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)



    }


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {


        val rootView = inflater.inflate(R.layout.fragment_home, container, false)

        firstViewPager = rootView.findViewById(R.id.view_pager_home)

        tabLayout = rootView.findViewById(R.id.tabs_home)
        tabLayout.setupWithViewPager(firstViewPager)

        setupViewPager(firstViewPager)
        return rootView


    }


    private fun setupViewPager(viewPager: ViewPager) {
        val adapter = HomeFragmentTabAdapter(childFragmentManager)
        adapter.addFragment(HomeFragmentForYou(), "For You")
        adapter.addFragment(HomeFragmentAll(), "All")
        adapter.addFragment(HomeFragmentNew(), "New")
        viewPager.adapter = adapter
    }

}

我现在的问题是:如何将 Tabs 放入 Fragment 中?

顺便说一句,我在所有事情上都使用 Kotlin。

这几天我一直在寻找一种方法来做到这一点。我确定有一个简单的解决方案,我只是找不到它,所以我指望你!

【问题讨论】:

    标签: android android-fragments tabs kotlin


    【解决方案1】:

    当你声明一个变量为val时,它与Java中声明它为final是一样的;一旦分配,就无法更改。此外,在类级别上声明的vals 不能从构造函数以外的其他方法初始化。 在方法中声明 val 遵循不同的规则;它需要分配,但不需要立即分配。唯一的要求是在访问之前进行初始化,但这是因为方法中的 vals 和 vars 与类级别的不同

    这意味着,由于您立即分配 val,它被锁定为 null。由于您尝试在onCreate 中更改它,因此您会收到错误,因为您无法重新分配已分配的 val。

    这意味着,由于您没有在构造函数(/init 块)或类似的东西中分配它,因此您必须使用var。我建议您使用lateinit var,因为这使您能够保持空值安全,因为您不需要初始化它。 Lateinit 正是您认为的意思;后期初始化。因此,将您的字段声明更改为:

    private lateinit var tabLayout: TabLayout
    private lateinit var firstViewPager: ViewPager
    

    【讨论】:

    • 感谢您的回答!现在程序编译没有错误。但遗憾的是,该应用程序没有加载选项卡的片段:/ 也许我做错了其他事情。你知道如何实现我想做的事吗?
    • 我已经把所有东西都放在了 GitHub 上,相关的是 HomeFragment 和标签的 3 个片段:github.com/Oribakun/tabs-inside-fragment-test
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多