Значки TabLayout не отображаются

Я новичок в Kotlin, конвертирую старое Java-приложение для Android в Kotlin. В моем приложении 2 вкладки. В моем старом приложении я мог отображать 1 значок вместо текста для заголовка каждой вкладки. Однако некоторые API в моем старом коде устарели, т.е.

context.getResources().getDrawable()

Я обновил это, как показано ниже, но ничего не работает.

Я пробовал:

  • Добавление вкладок вручную с помощью addTab() и с помощью setIcon()
  • Я разместил операторы журнала, чтобы убедиться, что мои изображения загружаются. Они делают.

Все равно ничего не работает. Что я делаю не так? Мой код следует.

Основная деятельность:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var viewPager = findViewById<ViewPager>(R.id.viewpager)
        var myTabLayout = findViewById<TabLayout>(R.id.tab_layout)

        var adapter = MyFragmentPagerAdapter(supportFragmentManager, this)
        viewPager.adapter = adapter

        //myTabLayout.addTab(myTabLayout.newTab().setIcon(R.drawable.sunrise))
        //myTabLayout.addTab(myTabLayout.newTab().setIcon(R.drawable.sunrise))
        myTabLayout.setupWithViewPager(viewPager)
    }
}

MyFragmentPagerAdapter:

class MyFragmentPagerAdapter(fm: FragmentManager, private val mContext: Context) :
    FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
    private lateinit var context: Context

    override fun getItem(position: Int): Fragment {
        return when (position) {
            0 -> TabFragment1()
            1 -> TabFragment2()
            else -> TabFragment1()
        }
    }

    override fun getCount(): Int {
        return 2
    }

    /*override fun getPageTitle(position: Int): CharSequence? {
        return when (position) {
            0 -> "First"
            1 -> "Second"
            else -> "First"
        }
    }*/

    override fun getPageTitle(position: Int): CharSequence? {
        val image: Drawable? = if (position == 0)
            //context.getResources().getDrawable(R.drawable.sunrise)
            ContextCompat.getDrawable(mContext, R.drawable.sunrise)
        else
            //context.getResources().getDrawable(R.drawable.sunset)
            ContextCompat.getDrawable(mContext, R.drawable.sunset)

        val sb = SpannableString(" ")
        Log.d("DEBUG", "Here")
        if (image != null) {
            image.setBounds(0, 0, image.intrinsicWidth, image.intrinsicHeight)
            Log.d("DEBUG", "image isn't null")

            val imageSpan = ImageSpan(image, ImageSpan.ALIGN_BOTTOM)
            sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        }
        return sb
    }
}

Мой основной файл макета:

<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context = ".MainActivity">

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

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

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.viewpager.widget.ViewPager
        android:id = "@+id/viewpager"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        app:layout_behavior = "@string/appbar_scrolling_view_behavior" />

</androidx.constraintlayout.widget.ConstraintLayout>
0
0
631
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, измените свой ViewPager на ViewPager2:

    <androidx.viewpager2.widget.ViewPager2
        android:id = "@+id/viewpager"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        app:layout_behavior = "@string/appbar_scrolling_view_behavior" />

Затем вы можете использовать TabLayoutMediator, чтобы прикрепить макет вкладки и пейджер. Измените свой код в методе onCreate следующим образом:

    override fun onCreate(savedInstanceState: Bundle?) 
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var viewPager = findViewById<ViewPager2>(R.id.viewpager)
        var myTabLayout = findViewById<TabLayout>(R.id.tab_layout)

        var adapter = MyFragmentPagerAdapter(supportFragmentManager)
        viewPager.adapter = adapter

        TabLayoutMediator(
            myTabLayout,
            viewPager
        ) { tab, position ->
            when(position) {
                0 -> {
                    tab.text = "First"
                    tab.icon = ContextCompat.getDrawable(this, R.drawable.sunrise)
                }
                else -> {
                    ...
                }
            }
        }.attach()
    }

Кроме того, измените свой FragmentPagerAdapter на FragmentStateAdapter:

    class MyFragmentPagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {

        override fun getItemCount(): Int = 2

        override fun createFragment(position: Int) : Fragment = when (position) {
            0 -> TabFragment1()
            else -> TabFragment2()
        }
    }

Сергей, вы герой!!!

Squareoot 14.11.2022 22:17

Другие вопросы по теме