Я новичок в 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>
Во-первых, измените свой 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()
}
}
Сергей, вы герой!!!