Котлин: FragmentPagerAdapter не меняет макет ViewPager - PullRequest
1 голос
/ 10 ноября 2019

Я пытаюсь создать табличный макет для моего приложения Android через класс адаптера. Однако макет, представленный в ViewPager, не изменяется при нажатии на разные вкладки. Ниже приведен мой код:

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:background="#ffffff"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"/>

    <ScrollView 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">


        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            tools:context=".MainActivity"
            app:tabTextAppearance="@style/MyCustomTextAppearance"
            >

            <!-- The tabular layout -->
            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tablayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                android:textAllCaps="false"
                android:background="#ffffff"
                >

            </com.google.android.material.tabs.TabLayout>

            <!-- Contains the fragment corresponding to each tab -->
            <androidx.viewpager.widget.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </ScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

total_fragment.xml, individual_fragment.xml, usage_fragment.xml - все это очень простые макеты с TextView в них.

Ниже приведен мой код Котлина (MainActivity.kt):

import PageAdapter
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import android.util.Log
import androidx.viewpager.widget.ViewPager
import com.google.android.material.tabs.TabLayout

var tabLayout: TabLayout? = null
var viewPagerReference: ViewPager? = null

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

        setContentView(R.layout.activity_main)

        tabLayout = findViewById<TabLayout>(R.id.tablayout)
        viewPagerReference = findViewById<ViewPager>(R.id.viewPager)

        tabLayout!!.addTab(tabLayout!!.newTab().setText("TabA"))
        tabLayout!!.addTab(tabLayout!!.newTab().setText("TabB"))
        tabLayout!!.addTab(tabLayout!!.newTab().setText("TabC"))
        tabLayout!!.tabGravity = TabLayout.GRAVITY_FILL

        val adapter = PageAdapter(this, supportFragmentManager, tabLayout!!.tabCount)
        viewPager!!.adapter = adapter

        viewPager!!.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))

        tabLayout!!.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
            override fun onTabSelected(tab: TabLayout.Tab) {
                Log.i("TextStats","NEW TAB SELECTED: " + tab.position)
                viewPager!!.currentItem = tab.position
            }
            override fun onTabUnselected(tab: TabLayout.Tab) {
            }
            override fun onTabReselected(tab: TabLayout.Tab) {
            }
        })
    }
}

Для класса адаптера (PageAdapter.kt):

import android.content.Context
import android.util.Log
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import com.example.textstats.IndividualFragment
import com.example.textstats.TotalFragment
import com.example.textstats.UsageFragment

class PageAdapter(private val myContext: Context, fm: FragmentManager, internal var totalTabs: Int) : FragmentPagerAdapter(fm) {

    // this is for fragment tabs
    override fun getItem(position: Int): Fragment? {
        Log.i("TextStats", "POSITION = " + position);
        when (position) {
            0 -> {
                //  val homeFragment: HomeFragment = HomeFragment()
                return TotalFragment()
            }
            1 -> {
                return IndividualFragment()
            }
            2 -> {
                // val movieFragment = MovieFragment()
                return UsageFragment()
            }
            else -> return null
        }
    }

    // this counts total number of tabs
    override fun getCount(): Int {
        return totalTabs
    }

}

TotalFragment, UsageFragment и IndividualFragment имеют все те же коды ниже, за исключением того, что идентификатор макета отличается (R.layout.[layout name]):

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

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

1 Ответ

1 голос
/ 10 ноября 2019

добавить эту строку после установки адаптера

   tabLayout.setupWithViewPager(viewPager)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...