求助:Bottom Sheet Fragment中按钮点击无响应如何解决?
Bottom Sheet Fragment 内部按钮点击无响应问题修复
问题场景
项目包含两个布局文件:
- activity_main.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") } } }
错误原因
原代码存在两个核心问题:
- Fragment的视图创建逻辑错误地放在了
onCreate()方法中,该阶段视图尚未开始加载,无法完成有效绑定; - 未将绑定的根视图返回给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
相关产品推荐
相关产品推荐

