“ android.view.WindowManager $ BadTokenException:无法添加窗口-令牌null无效;您的活动是否正在运行?”

问题描述

我的应用程序正在使用BottomSheetDialog,应该通过单击fab来打开它,但是由于某些原因,我会收到此错误

E / Android运行时:致命异常:主要 流程:com.vorobyoff.starwars,PID:4048 android.view.WindowManager $ BadTokenException:无法添加窗口-令牌null无效;您的活动正在进行吗? 在android.view.ViewRootImpl.setView(ViewRootImpl.java:765) 在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356) 在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) 在android.app.Dialog.show(Dialog.java:330) 在com.vorobyoff.starwars.activities.main.MainActivity $ createBottomSheet $$ inlined $ apply $ lambda $ 1.onClick(MainActivity.kt:92) 在android.view.View.performClick(View.java:6294) 在android.view.View $ PerformClick.run(View.java:24770) 在android.os.Handler.handleCallback(Handler.java:790) 在android.os.Handler.dispatchMessage(Handler.java:99) 在android.os.Looper.loop(Looper.java:164) 在android.app.ActivityThread.main(ActivityThread.java:6494) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:438) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

MainActivity.kt

MainActivity类:MvpAppCompatActivity(),MainView {

@InjectPresenter
lateinit var presenter: MainPresenter
private lateinit var binding: ActivityMainBinding
private lateinit var dialog: BottomSheetDialog
private lateinit var filmAdapter: Adapter<Film>
private var favoriteFilmsAdapter: Adapter<Film>? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    setSupportActionBar(MainActionBarBinding.inflate(layoutInflater).root)

    dialog = BottomSheetDialog(applicationContext)

    binding.apply {
        favoriteFilmsButton.setonClickListener { dialog.show() }

        filmsRecyclerView.apply {
            filmAdapter = getFilmAdapter
            layoutManager =
                linearlayoutmanager(context,RecyclerView.VERTICAL,false)
            itemtouchhelper(itemtouchhelperCallback(filmAdapter)).attachToRecyclerView(this)
            addItemdecoration(Itemdecoration(8))
            adapter = filmAdapter
            setHasFixedSize(true)
        }
    }

    presenter.getFilms()
    presenter.favoriteFilms.observe(this@MainActivity,{ films ->
        when (true) {
            films.isNullOrEmpty() -> {
                binding.favoriteFilmsButton.apply {
                    visibility = View.GONE
                    isClickable = false
                    dialog.dismiss()
                    return@observe
                }
            }
            favoriteFilmsAdapter == null -> createBottomSheet()
        }

        favoriteFilmsAdapter?.add(films[films.lastIndex])
    })
}

@ProvidePresenter
fun provideMainPresenter(): MainPresenter = MainPresenter(applicationContext)

override fun setFilms(films: List<Film>) = filmAdapter.update(films)

private fun createBottomSheet() {
    binding.favoriteFilmsButton.apply {
        visibility = View.VISIBLE
        isClickable = true
    }

    val bottomSheetView = BottomSheetBinding.inflate(layoutInflater).root
    dialog.setContentView(bottomSheetView)

    bottomSheetView.favorite_films_list.apply {
        favoriteFilmsAdapter = getFavoriteFilmsAdapter
        layoutManager = linearlayoutmanager(this@MainActivity,false)
        itemtouchhelper(itemtouchhelperCallback(favoriteFilmsAdapter as Adapter<Film>))
            .attachToRecyclerView(this)
        addItemdecoration(Itemdecoration(4))
        adapter = favoriteFilmsAdapter
        setHasFixedSize(true)
    }
}

private val getFilmAdapter = object : Adapter<Film>(
    { startActivity(DetailActivity.showDetail(applicationContext,it.url)) },{ presenter.insert(it) }
) {
    override fun getLayoutId(position: Int,objects: Film) = R.layout.film_item
}

private val getFavoriteFilmsAdapter = object : Adapter<Film>(
    { startActivity(DetailActivity.showDetail(applicationContext,{ presenter.delete(it) }
) {
    override fun getLayoutId(position: Int,objects: Film) = R.layout.favorite_film_item
}

}

这个想法是向用户显示bottomSheetView.favorite_films_recycler_view中的数据,该数据是从会议室数据库中加载的,每次在films_recycler_view中刷一个项目时,都会将其添加数据库中,通过livedata我了解了这一变化,开始创建对话框 git项目:https://github.com/vorobyoff/star_wars/tree/dev/app/src/main/java/com/vorobyoff/starwars

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...