Поместите вкладки во фрагмент BottomNavigationView - PullRequest
0 голосов
/ 19 мая 2018

Итак, я создал приложение, которое содержит BottomNavView с 4 различными фрагментами и 4 различными макетами.(Домой, Список книг, Недавние и Загрузки)

Теперь я хочу поместить 3 вкладки внутри первого фрагмента (который является домашним фрагментом).Я нашел много учебных пособий о том, как реализовать вкладки внутри AppCompatActivity, но я хочу поместить их в HomeFragment.

Код: В настоящее время у меня есть свой BottomNavView в activity_main.xml и4 фрагмента (Главная, Список книг, Последние, Загрузки).Затем я сделал 3 фрагмента для вкладок (ForYou, All, New).

Вот ссылка GitHub для всех файлов: https://github.com/Oribakun/tabs-inside-fragment-test

Это мой фрагмент_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: я думал, что это сработает, но я получаю сообщение об ошибке «Val нельзя переназначить» при наведении указателей firstViewPager и tabLayout в строках 46 и 48.

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 голосов
/ 19 мая 2018

Когда вы объявляете переменную как val, это то же самое, что объявлять ее как окончательную в Java;как только он был назначен, он не может быть изменен.Кроме того, val s, объявленные на уровне класса, не могут быть инициализированы из других методов, кроме конструктора. Объявление val в методе следует другим правилам;это должно быть назначено, но это не должно быть сразу.Единственное требование - инициализация перед доступом, но это потому, что значения и переменные в методах отличаются от значений на уровне класса

Это означает, что, поскольку вы присваиваете значение val мгновенно, оно блокируется на нулевое значение.Так как вы пытаетесь изменить его в onCreate, вы получаете ошибку, потому что вы не можете переназначить уже назначенный val.

Это означает, что, поскольку вы не назначаете его в конструкторе (блок / init) или чем-то подобном, вы должны использовать var.Я рекомендую вам использовать lateinit var, потому что это позволяет поддерживать нулевую безопасность, поскольку вам не нужно его инициализировать.Lateinit это именно то, что вы думаете, это означает;поздняя инициализация.Поэтому измените объявление ваших полей на:

private lateinit var tabLayout: TabLayout
private lateinit var firstViewPager: ViewPager
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...