所以我构建了一个包含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来做所有事情。
我现在正在寻找一种方法来做这件事。我确信有一个简单的解决方案,我找不到它所以我依靠你!
答案 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