问题描述
我的应用程序正在使用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 (将#修改为@)