我已经实现了一个启动BottomSheetDialog的方法,但是我面临着这个错误
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:907)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:387)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
at android.app.Dialog.show(Dialog.java:342)
at com.example.moveapplication.adapter.PostAdapter.openBottomSheet(PostAdapter.kt:136)
at com.example.moveapplication.adapter.PostAdapter.onBindViewHolder$lambda-2(PostAdapter.kt:53)
at com.example.moveapplication.adapter.PostAdapter.$r8$lambda$Ya4NMbtCP1ASbfWIkCscOWrPyOw(Unknown Source:0)
at com.example.moveapplication.adapter.PostAdapter$$ExternalSyntheticLambda2.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)下面是在单击项之后调用的方法
private fun openBottomSheet(publisher: String) {
val inflater = mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val view = inflater.inflate(R.layout.bottom_sheet_dialog, null)
val uImage = view.findViewById<ImageView>(R.id.sheetIvProfileImage)
val uNumber = view.findViewById<TextView>(R.id.sheetTvOwnerNumber)
val uEmail = view.findViewById<TextView>(R.id.tvOwnerEmail)
val uAbout = view.findViewById<TextView>(R.id.tvOwnerAbout)
val uTitle = view.findViewById<TextView>(R.id.sheetTvOwnerTitle)
val ownersRef = FirebaseFirestore.getInstance().collection("owners").document(publisher)
ownersRef.get().addOnSuccessListener { document ->
val ownerModel = document.toObject(Owner::class.java)
Glide.with(mContext)
.load(ownerModel!!.profileImage)
.into(uImage)
uTitle.text = ownerModel.username
uNumber.text = ownerModel.phoneNumber
uEmail.text = ownerModel.email
uAbout.text = ownerModel.about
}
val bottomSheetDialog = Dialog(mContext)
bottomSheetDialog.apply {
setContentView(view)
setCancelable(true)
window?.setLayout(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT)
window?.setGravity(Gravity.BOTTOM)
show()
}
}我不熟悉另一种方法来做膨胀底部板对话框。使用这种方法是一次试验,目的是看看它是否能起作用。
在我的onBindViewHolder (负责单击的项目)上,我已经以这种方式实现了它
holder.publisher.setOnClickListener {
openBottomSheet(post.publisher)
}发布于 2022-06-15 08:00:11
要做到这一点,您可以很容易地使用材料设计底片。首先,您需要向build.gradle添加物质依赖:
dependencies {
// ...
implementation 'com.google.android.material:material:<version>'
// ...
}然后您应该创建一个kotlin文件/类并扩展BottomSheetDialogFragment()
class ModalBottomSheet : BottomSheetDialogFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.modal_bottom_sheet_content, container, false)
}您还可以将不同的样式设置为自定义底部工作表。
您可以看到下面的基本用法:
class MainActivity : AppCompatActivity() {
...
val modalBottomSheet = ModalBottomSheet()
modalBottomSheet.show(supportFragmentManager, TAG)
...
}更新
您可以创建一个接口,并在适配器构造函数中使用它将回调返回给父(在其中创建适配器)。
interface PostAdapterCallback{
onPublisherClicked(publisher : String)
//or
onOwnerClicked(owner: Owner)
}
class PostAdapter(private val publisherList: List<String>, val callback:PostAdapterCallback){}现在,您可以将模型放在适配器中并将所有者模型作为回调传递,或者将发布服务器传递给您的活动并在那里调用您的FirebaseFirestore.getInstance()。
在你的活动中:
override fun onOwnerClicked(owner : Owner){
//you can call you bottomsheet here and pass you model as a bundle if you need
}发布于 2022-06-15 08:35:20
创建一个接口
interface RecyclerClickListeners {
fun onRecyclerViewItemClick(view: View, model:Model) }向RecyclerAdapter和片段添加接口
碎片:
class TestFragment :
Fragment(),
RecyclerClickListeners {
private val recyclerAdapter = TestRecyclerAdapter(arrayListOf(),this)... }回收适配器:
class TestRecyclerAdapter(private val modelList: ArrayList<Model>, val listener: RecyclerClickListeners) ...将onBindViewHolder中的模型发送到片段
holder.binding.root.setOnClickListener {
listener.onRecyclerViewItemClick(it, modelList[position])
}在片段调用或创建底部页对话框中
override fun onRecyclerViewItemClick(view: View, model: Model) { openBottonSheetFragment(model) }现在,您可以在底部工作表片段中使用ownerModel。
发布于 2022-06-16 11:03:54
private void showBottomSheetDialog() {
final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this);
bottomSheetDialog.setContentView(R.layout.bottom_sheet_dialog);
...
bottomSheetDialog.show();
}在回收设备上调用上面的功能
https://stackoverflow.com/questions/72627169
复制相似问题