Android BottomSheetDialog找不到R.id.design_bottom_sheet

MaterialDesign底部抽屉布局透明化实现,
本文介绍了如何在Android应用中使用GoogleMaterialDesign的BottomSheetDialog,并且使底部抽屉背景透明。开发者需在设置内容视图后修改design_bottom_sheet的背景颜色。

        因为R.id.design_bottom_sheet 是来自于 com.google.android.material 包的 BottomSheetDialog 的内部资源 ID,使用

com.google.android.material.R.id.design_bottom_sheet
mBottomSheetDialog = new BottomSheetDialog(this,R.style.BottomSheetDialogStyle);
dialogBottomView = getLayoutInflater().inflate(R.layout.dialog_bottom, null);
mBottomSheetDialog.setContentView(dialogBottomView);
//必须在setContentView下面
mBottomSheetDialog.getWindow().findViewById(com.google.android.material.R.id.design_bottom_sheet).setBackgroundColor(Color.TRANSPARENT);

package com.example.bulbpage.editpreset import android.app.Dialog import android.content.Context import android.content.res.ColorStateList import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.SeekBar import androidx.core.content.ContextCompat import com.example.bulbpage.R import com.example.bulbpage.databinding.FragmentEditPresetBinding import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.button.MaterialButton class EditPresetFragment : BottomSheetDialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) isCancelable = true // 允许点击外部关闭 } //颜色接口 interface OnColorHexSelectedListener { fun onColorHexSelected(color: String) } // 色温接口 interface OnTemperatureChangeListener { fun onTemperatureChange(temperature: Int) } private var temperatureListener: OnTemperatureChangeListener? = null // 亮度接口 interface OnBrightnessChangeListener { fun onBrightnessChange(brightness: Int) } private var brightnessListener: OnBrightnessChangeListener? = null private var colorHexListener: OnColorHexSelectedListener? = null private var _binding: FragmentEditPresetBinding? = null private val binding get() = _binding!! override fun onAttach(context: Context) { super.onAttach(context) // 初始化色温监听器 if (context is OnTemperatureChangeListener) { temperatureListener = context } else { throw RuntimeException("$context must implement OnTemperatureChangeListener") } // 初始化亮度监听器 brightnessListener = context as? OnBrightnessChangeListener ?: throw ClassCastException("$context must implement OnBrightnessChangeListener") // 初始化颜色监听器 colorHexListener = context as? OnColorHexSelectedListener ?: throw IllegalStateException("$context must implement OnColorHexSelectedListener") } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentEditPresetBinding.inflate(inflater, container, false) return binding.root } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog dialog.setOnShowListener { val sheet = dialog.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout val behavior = BottomSheetBehavior.from(sheet) behavior.state = BottomSheetBehavior.STATE_EXPANDED behavior.isDraggable = false behavior.skipCollapsed = true // 跳过折叠状态 behavior.peekHeight = BottomSheetBehavior.PEEK_HEIGHT_AUTO // 自动高度 } return dialog } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) (dialog as? BottomSheetDialog)?.behavior?.isDraggable = false val bottomSheet = (dialog as? BottomSheetDialog)?.behavior // 初始化按钮状态 binding.buttonA.isClickable = true binding.buttonA.isFocusable = true binding.buttonB.isClickable = true binding.buttonB.isFocusable = true setButtonSelected(binding.buttonA, true) setButtonSelected(binding.buttonB, false) binding.buttonA.setOnClickListener { binding.buttonA.isChecked = true binding.buttonB.isChecked = false setButtonSelected(binding.buttonA, true) setButtonSelected(binding.buttonB, false) // 显示 white_light 组,隐藏 Color Light 组 binding.whiteLight.visibility = View.VISIBLE binding.colorLight.visibility = View.GONE } binding.buttonB.setOnClickListener { binding.buttonB.isChecked = true binding.buttonA.isChecked = false setButtonSelected(binding.buttonA, false) setButtonSelected(binding.buttonB, true) // 隐藏 white_light 组,显示 Color Light 组 binding.whiteLight.visibility = View.GONE binding.colorLight.visibility = View.VISIBLE } binding.imageView3.setOnClickListener { dismiss() } binding.buttonDone.setOnClickListener { dismiss() } val overlayView = binding.overlayView val temperatureTextView = binding.temperatureTextView val colorTextView = binding.colorTextView val colorWheelView = binding.colorWheelView overlayView.onTemperatureChangeListener = { temperature -> temperatureTextView.text = "${temperature.toInt()}K" temperatureListener?.onTemperatureChange(temperature.toInt()) } colorWheelView.setOnColorSelectedListener { colorHex -> colorTextView.text = colorHex colorHexListener?.onColorHexSelected(colorHex) } // ✅ 在 onViewCreated 中设置 SeekBar 监听器 val seekBar = binding.seekBar val lightnessTextview = binding.lightness seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { lightnessTextview.text = "$progress%" } override fun onStartTrackingTouch(seekBar: SeekBar?) {} override fun onStopTrackingTouch(seekBar: SeekBar?) { brightnessListener?.onBrightnessChange(seekBar?.progress ?: 0) } }) } private fun setButtonSelected(button: MaterialButton, isSelected: Boolean) { button.isChecked = isSelected if (isSelected) { button.backgroundTintList = ColorStateList.valueOf( ContextCompat.getColor(requireContext(), R.color.skyblue) ) button.setTextColor(Color.WHITE) } else { button.backgroundTintList = ColorStateList.valueOf(Color.WHITE) button.setTextColor(Color.BLACK) } } override fun onDestroyView() { super.onDestroyView() _binding = null } } 让亮度跟随seekbar拖动实时改变而不是松开手后改变
最新发布
08-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值