Как сделать ViewPager внутри BottomSheet Android - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу создать 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)
            }
        })
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...