android - TabLayout 图标不显示
问题描述
我是将旧的 Android Java 应用程序转换为 Kotlin 的 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" />
然后,您可以使用 aTabLayoutMediator
来附加选项卡布局和视图分页器。将方法中的代码更改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()
}
}
推荐阅读
- c++ - C++ 中 std::iota 的效率?
- google-kubernetes-engine - 将我的 GKE 集群连接到本地数据库
- c++ - 递归模板调用中无法调用模板化函数重载
- python - 在将字符串绘制为图像时获取每个字符的边界框信息
- cypher - 无法在 gremlin 中使用密码创建索引
- node.js - GCP:应用服务版本的配置
- cesium - 如何在铯中定义tileset位置
- rust - 为什么 FlatBufferBuilder 有生命周期?
- vba - 如何在不影响其余文本的情况下将某些文本的样式更改为标题 1 的样式
- ios - 有没有办法使用 SwiftUI 将选项绑定到 Toggle / Slider