You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Bottom Sheet Fragment中按钮点击无响应如何解决?

Bottom Sheet Fragment 内部按钮点击无响应问题修复

问题场景

项目包含两个布局文件:

  • activity_main.xml
    activity_main.xml
  • bottomsheet_fragment.xml
    bottomsheet_fragment.xml

主界面中id为btn_show的「Click here」按钮可正常唤起Bottom Sheet Fragment,但点击Bottom Sheet内id为btn_button1的按钮时,无法触发弹出「You pressed button 1」Toast的预期操作。

相关文件代码

bottomsheet_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:text="Sample button 1"
        />

</LinearLayout>

原BottomSheetFragment.kt代码(存在问题)

package android.example.naruto

import android.example.naruto.databinding.ActivityMainBinding
import android.example.naruto.databinding.BottomsheetFragmentBinding
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import com.google.android.material.bottomsheet.BottomSheetDialogFragment

class BottomSheetFragment: BottomSheetDialogFragment() {

    private lateinit var binding2: BottomsheetFragmentBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding2 = BottomsheetFragmentBinding.inflate(layoutInflater)

        binding2.btnButton1.setOnClickListener{
            Toast.makeText(context, "You pressed on button 1!", Toast.LENGTH_SHORT).show()
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click here"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

package android.example.naruto

import android.example.naruto.databinding.ActivityMainBinding
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

    private lateinit var binding1: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding1 = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding1.root)

        val bottomSheetFragment= BottomSheetFragment()

        binding1.btnShow.setOnClickListener {
           bottomSheetFragment.show(supportFragmentManager, "BottomSheetDialog")
        }
    }
}

错误原因

原代码存在两个核心问题:

  1. Fragment的视图创建逻辑错误地放在了onCreate()方法中,该阶段视图尚未开始加载,无法完成有效绑定;
  2. 未将绑定的根视图返回给Fragment,导致初始化的视图并未被加载到界面中,按钮自然无法响应点击。

修复方案

修改BottomSheetFragment.kt,将视图绑定和点击事件逻辑移到onCreateView()方法中,并返回绑定的根视图:

package android.example.naruto

import android.example.naruto.databinding.BottomsheetFragmentBinding
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import com.google.android.material.bottomsheet.BottomSheetDialogFragment

class BottomSheetFragment: BottomSheetDialogFragment() {

    private lateinit var binding2: BottomsheetFragmentBinding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        // 在onCreateView中初始化视图绑定,传入正确的inflater和container
        binding2 = BottomsheetFragmentBinding.inflate(inflater, container, false)
        
        // 设置按钮点击事件
        binding2.btnButton1.setOnClickListener{
            Toast.makeText(context, "You pressed on button 1!", Toast.LENGTH_SHORT).show()
        }
        
        // 返回绑定的根视图,让Fragment加载该视图
        return binding2.root
    }
}

内容的提问来源于stack exchange,提问作者Manika Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:35:31