FragmentPagerAdapter veraltet

Lesezeit: 4 Minuten

Benutzer-Avatar
wbk727

Seit API 27 FragmentPagerAdapter ist veraltet. Was ist die beste Alternative dafür?

In meinem Fall verstehe ich so etwas wie super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) müsste verwendet werden, aber ich weiß nicht, wo in meinem Code das hingehört.

Ich habe diese Importe in meiner Klasse:

import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter

aber FragmentPagerAdapter in class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){ ist durchgestrichen.

class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){
        private val fragmentList : MutableList<androidx.fragment.app.Fragment> = ArrayList()
        private val titleList : MutableList<String> = ArrayList()

        override fun getItem(position: Int): androidx.fragment.app.Fragment {
            return fragmentList[position]
        }

        override fun getCount(): Int {
            return fragmentList.size
        }

        fun addFragment(fragment: androidx.fragment.app.Fragment, title: String){
            fragmentList.add(fragment)
            titleList.add(title)
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return titleList[position]
        }
    }

Benutzer-Avatar
CommonsWare

UPDATE 2021-06-14: An dieser Stelle, ViewPager selbst ist alles andere als veraltet. Technisch, ViewPager ist nicht veraltet, aber die beiden konkret PagerAdapter Implementierungen — FragmentPagerAdapter und FragmentStatePagerAdapter – sind veraltet. Wechseln Sie idealerweise zu etwas anderem, z ViewPager2 oder der in Accompanist zusammensetzbare Pager.

Ersetzen:

class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager)

mit:

class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)

(vorausgesetzt, dass MyViewPagerAdapter muss dieser Wert nicht konfigurierbar sein)

  • Warum brauche ich das, nachdem ich dieses @SuppressLint (“WrongConstant”) hinzugefügt habe, nachdem ich dies im Konstruktor FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT hinzugefügt habe?

    – Asad Mukhtar

    3. Dezember 2019 um 19:28 Uhr

  • @AsadMukhtar: Ich weiß es nicht, tut mir leid. Sie könnten eine separate Stack Overflow-Frage stellen, in der Sie ein reproduzierbares Minimalbeispiel angeben können, das zeigt, was Sie versuchen und wo Sie diese Anmerkung anwenden mussten.

    – CommonsWare

    3. Dezember 2019 um 23:04 Uhr

  • Ich habe das gleiche Problem mit dem Konstruktor, er soll einen LifeCycle-Parameter erhalten, denke ich.

    – Everett

    25. Mai 2020 um 23:34 Uhr

  • Alternativ können Sie auch sagen @SuppressWarnings("deprecation") in Fällen wo ViewPager2 bricht Ihr App-Verhalten 😀

    – EpicPandaForce

    14. Juni 2021 um 12:26 Uhr

  • @EpicPandaForce: Einverstanden, obwohl Google irgendwann die Aktualisierung einstellen wird androidx.viewpager:viewpager. Selbst dann können Sie möglicherweise die zuletzt ausgelieferte Version für eine Weile verwenden, bevor eine transitive Abhängigkeit oder etwas den Build unterbricht, wenn Sie andere Dinge aktualisieren. Wir müssen also nicht rennen und ersetzen ViewPager diese Woche, aber ich würde es irgendwann in den nächsten ein oder zwei Jahren empfehlen.

    – CommonsWare

    14. Juni 2021 um 12:31 Uhr

Die Javadocs haben tatsächlich den folgenden Hinweis auf veraltete Inhalte FragmentPagerAdapter:


Diese Klasse ist veraltet.

Wechseln zu ViewPager2 und verwenden FragmentStateAdapter stattdessen.


  • Diese Lösung funktioniert nicht, wenn Sie ViewPager erweitern möchten, weil ViewPager2 ist public final.

    – Neoh

    9. April 2020 um 11:51 Uhr

  • wie bearbeite ich das github.com/android/views-widgets-samples/issues/107

    – Pemba Tamang

    17. September 2021 um 12:14 Uhr

Wechseln Sie mit FragmentStateAdapter zu ViewPager2.

Hier ist die XML-Ansicht: –

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>
class AdapterTabPager(activity: FragmentActivity?) : FragmentStateAdapter(activity!!) {
    private val mFragmentList: MutableList<Fragment> = ArrayList()
    private val mFragmentTitleList: MutableList<String> = ArrayList()
    
    public fun getTabTitle(position : Int): String{
        return mFragmentTitleList[position]
    }

    fun addFragment(fragment: Fragment, title: String) {
        mFragmentList.add(fragment)
        mFragmentTitleList.add(title)
    }

    override fun getItemCount(): Int {
        return mFragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return mFragmentList[position]
    }
}

So instanziieren Sie ViewPager:-

val adapter = AdapterTabPager(activity)
        adapter.addFragment(categoryFragment, "Category")
        adapter.addFragment(brandFragment, "Brand")

        rootView.viewpager.adapter = adapter
        rootView.viewpager.currentItem = 0
        TabLayoutMediator(rootView.tabs, rootView.viewpager) { tab, position ->
            tab.text = adapter.getTabTitle(position)
        }.attach()

Sie müssen zu ViewPager2 wechseln, sie haben hier eine Migrationsanleitung.

https://developer.android.com/training/animation/vp2-migration#java

Benutzer-Avatar
Bruno Serralheiro

Es scheint, als wäre nicht nur der Konstruktor ohne Verhalten, sondern die Klasse FragmentPagerAdapter (was viel Speicher verbrauchen kann, indem es Fragmente im Speicher behält) und FragmentStatePagerAdapter befinden sich beide in der Abschreibungsphase. Ich frage mich, was verwendet werden kann, um die abstrakte Klasse zu erweitern PagerAdapter um die Lebensdauer der Codebasis zu verlängern.

Benutzer-Avatar
Tippu Fisal-Sheriff

Sie können verwenden FragmentStateAdapter(fragment)

class YourViewPagerAdapter(fragment: Fragment, val mFragmentList: Array<String>, val viewPager: ViewPager2) :  FragmentStateAdapter(fragment){

    override fun getItemCount(): Int {
        return mFragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        when(position){
            0 -> return YourFirstTabFragment()
            1 -> return YourSecondTabFragment()
            2 -> return YourThirdTabFragment()

        }
        return YourFirstTabFragment()
    }


}

1311090cookie-checkFragmentPagerAdapter veraltet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy