将标签放在BottomNavigationView的片段中

时间:2018-05-19 13:40:13

标签: android android-fragments tabs kotlin

所以我构建了一个包含BottomNavView的应用程序,其中有4个不同的片段和4种不同的布局。 (主页,书目,最新和下载)

现在我想在第一个片段(HomeFragment)中放入3个Tabs。我发现了许多关于如何在AppCompatActivity中实现Tabs的教程,但我想做的是将它们放在HomeFragment中。

代码: 目前,我在activity_main.xml和4片段(Home,Booklist,Recent,Downloads)中有我的BottomNavView。 然后,我为标签制作了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
    }

}

我现在的问题是:如何将标签放入片段?

顺便说一句,我用Kotlin来做所有事情。

我现在正在寻找一种方法来做这件事。我确信有一个简单的解决方案,我找不到它所以我依靠你!

1 个答案:

答案 0 :(得分:0)

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

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

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

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