Я хочу создать BottomSheet, внутри которого я создал TabLayout и ViewPager. но его держать показать ошибку. Я взглянул на поток стека и попытался исправить его, но не повезло.
2019-11-07 16:13:02.498 29979-29979/com.sagara.aquagabut E/FragmentManager: No view found for id 0x7f080055 (com.sagara.aquagabut:id/bv_sticker_pager) for fragment StickerSelectedFragment{e728952 (27988046-d751-4363-8e88-b51f65c094eb) id=0x7f080055 android:switcher:2131230805:0}
2019-11-07 16:13:02.498 29979-29979/com.sagara.aquagabut E/FragmentManager: Activity state:
2019-11-07 16:13:02.567 29979-29979/com.sagara.aquagabut E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sagara.aquagabut, PID: 29979
java.lang.IllegalArgumentException: No view found for id 0x7f080055 (com.sagara.aquagabut:id/bv_sticker_pager) for fragment StickerSelectedFragment{e728952 (27988046-d751-4363-8e88-b51f65c094eb) id=0x7f080055 android:switcher:2131230805:0}
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:875)
, когда я удаляю адаптер, он работает нормально. но при использовании адаптера для просмотра пейджер выдает ошибку. это мой адаптер.
class StickerTabAdapter(
private val mContext: Context,
private val fragmentManager: FragmentManager,
private val isSticker: Boolean = true
): FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
private val mFragmentList = mutableListOf<Fragment>()
private val mFragmentItemTab = mutableListOf<StickerUser>()
override fun getCount(): Int {
return mFragmentList.size
}
fun addItem(fragment: Fragment, itemTab: StickerUser){
mFragmentList.add(fragment)
mFragmentItemTab.add(itemTab)
}
fun invalidate(){
mFragmentList.forEach {
fragmentManager.beginTransaction().remove(it).commitNow()
}
clear()
}
fun clear(){
mFragmentList.clear()
mFragmentItemTab.clear()
}
override fun getItem(position: Int): Fragment {
return mFragmentList[position]
}
fun getView(position: Int): View {
val item = mFragmentItemTab[position]
val v = LayoutInflater.from(mContext).inflate(R.layout.tab_item_sticker, null)
val uri = if (isSticker){
Media.downloadSticker(item.stickerId, item.preview)
}else{
Media.downloadPrangko(item.stickerId, item.preview)
}
Glide.with(mContext).load(uri).into(v.tab_item_sticker_image)
return v
}
fun changeItem(itemTab: StickerUser, position: Int){
mFragmentItemTab[position] = itemTab
}
}
это моя функция для отображения BottomSheet, который я использую MaterialDialog с customView.
fun showStickerDialog(fragmentManager: FragmentManager, stickerUser: List<StickerUser>): MaterialDialog{
return MaterialDialog(context, BottomSheet(LayoutMode.WRAP_CONTENT)).apply {
title(text = "Sticker")
customView(R.layout.bottom_view_select_sticker, scrollable = true)
val fragmentAdapter = StickerTabAdapter(getCustomView().context, fragmentManager, true)
stickerUser.forEach {
fragmentAdapter.addItem(StickerSelectedFragment.newInstance(it), it)
}
getCustomView().bv_sticker_pager.adapter = fragmentAdapter
getCustomView().bv_sticker_tab.setupWithViewPager(getCustomView().bv_sticker_pager)
for (i in 0 until getCustomView().bv_sticker_tab.tabCount) {
val tab = getCustomView().bv_sticker_tab.getTabAt(i)
tab?.customView = null
tab?.customView = fragmentAdapter.getView(i)
}
getCustomView().bv_sticker_tab.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{
override fun onTabReselected(p0: TabLayout.Tab?) {
p0!!.customView = null
p0.customView = fragmentAdapter.getView(p0.position)
}
override fun onTabSelected(p0: TabLayout.Tab?) {
p0!!.customView = null
p0.customView = fragmentAdapter.getView(p0.position)
}
override fun onTabUnselected(p0: TabLayout.Tab?) {
p0!!.customView = null
p0.customView = fragmentAdapter.getView(p0.position)
}
})
}
}