首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从一个项目中点击一个BottomSheetDialog来膨胀RecyclerVIew?

从一个项目中点击一个BottomSheetDialog来膨胀RecyclerVIew?
EN

Stack Overflow用户
提问于 2022-06-15 07:06:42
回答 3查看 139关注 0票数 0

我已经实现了一个启动BottomSheetDialog的方法,但是我面临着这个错误

代码语言:javascript
复制
 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)

下面是在单击项之后调用的方法

代码语言:javascript
复制
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 (负责单击的项目)上,我已经以这种方式实现了它

代码语言:javascript
复制
 holder.publisher.setOnClickListener {
        openBottomSheet(post.publisher)
    }
EN

回答 3

Stack Overflow用户

发布于 2022-06-15 08:00:11

要做到这一点,您可以很容易地使用材料设计底片。首先,您需要向build.gradle添加物质依赖:

代码语言:javascript
复制
dependencies {
    // ...
    implementation 'com.google.android.material:material:<version>'
    // ...
}

然后您应该创建一个kotlin文件/类并扩展BottomSheetDialogFragment()

代码语言:javascript
复制
class ModalBottomSheet : BottomSheetDialogFragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.modal_bottom_sheet_content, container, false)
}

您还可以将不同的样式设置为自定义底部工作表。

您可以看到下面的基本用法:

代码语言:javascript
复制
class MainActivity : AppCompatActivity() {
    ...
    val modalBottomSheet = ModalBottomSheet()
    modalBottomSheet.show(supportFragmentManager, TAG)
    ...
}

更新

您可以创建一个接口,并在适配器构造函数中使用它将回调返回给父(在其中创建适配器)。

代码语言:javascript
复制
interface PostAdapterCallback{
    onPublisherClicked(publisher : String)
    //or
    onOwnerClicked(owner: Owner)
}

class PostAdapter(private val publisherList: List<String>, val callback:PostAdapterCallback){}

现在,您可以将模型放在适配器中并将所有者模型作为回调传递,或者将发布服务器传递给您的活动并在那里调用您的FirebaseFirestore.getInstance()。

在你的活动中:

代码语言:javascript
复制
override fun onOwnerClicked(owner : Owner){
    //you can call you bottomsheet here and pass you model as a bundle if you need
}
票数 0
EN

Stack Overflow用户

发布于 2022-06-15 08:35:20

创建一个接口

代码语言:javascript
复制
interface RecyclerClickListeners {
fun onRecyclerViewItemClick(view: View, model:Model) }

向RecyclerAdapter和片段添加接口

碎片:

代码语言:javascript
复制
class TestFragment :
Fragment(),    
RecyclerClickListeners {
private val recyclerAdapter = TestRecyclerAdapter(arrayListOf(),this)... }

回收适配器:

代码语言:javascript
复制
class TestRecyclerAdapter(private val modelList: ArrayList<Model>, val listener: RecyclerClickListeners) ...

将onBindViewHolder中的模型发送到片段

代码语言:javascript
复制
       holder.binding.root.setOnClickListener {
        listener.onRecyclerViewItemClick(it, modelList[position])
    }

在片段调用或创建底部页对话框中

代码语言:javascript
复制
override fun onRecyclerViewItemClick(view: View, model: Model) { openBottonSheetFragment(model) }

现在,您可以在底部工作表片段中使用ownerModel。

票数 0
EN

Stack Overflow用户

发布于 2022-06-16 11:03:54

代码语言:javascript
复制
private void showBottomSheetDialog() {

    final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this);
    bottomSheetDialog.setContentView(R.layout.bottom_sheet_dialog);

    ...

    bottomSheetDialog.show();
}

在回收设备上调用上面的功能

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72627169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档