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

无法从XML填充RelativeLayout:BottomSheet实现崩溃求助

解决自定义View Inflate崩溃问题

从你的报错日志核心信息 java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] 就能直接定位问题:你的自定义View OrderbookFilterMenu 缺少了LayoutInflater加载XML时必须调用的构造方法。

当Android系统从XML布局中加载自定义View时,会自动尝试调用带有Context和AttributeSet这两个参数的构造方法,如果你的类里没有实现这个构造方法,就会抛出这个异常。

解决方案分两种情况:

情况1:你想把OrderbookFilterMenu作为自定义View嵌入XML

补全OrderbookFilterMenu的构造方法,确保它至少包含以下三个构造方法(Kotlin或Java版本任选):

Kotlin版本:

class OrderbookFilterMenu @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr) {

    init {
        // 加载底部菜单布局到当前View
        LayoutInflater.from(context).inflate(R.layout.view_orderbook_bottom_menu_filter, this, true)
        // 初始化控件和逻辑
        initViews()
    }

    private fun initViews() {
        // 示例:初始化确认按钮监听
        val confirmBtn = findViewById<CoreFontButton>(R.id.filter_confirm_button)
        confirmBtn.setOnClickListener {
            // 这里添加按钮点击逻辑
        }
    }
}

Java版本:

public class OrderbookFilterMenu extends RelativeLayout {

    public OrderbookFilterMenu(Context context) {
        super(context);
        init();
    }

    public OrderbookFilterMenu(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public OrderbookFilterMenu(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        LayoutInflater.from(getContext()).inflate(R.layout.view_orderbook_bottom_menu_filter, this, true);
        // 示例:初始化确认按钮监听
        CoreFontButton confirmBtn = findViewById(R.id.filter_confirm_button);
        confirmBtn.setOnClickListener(v -> {
            // 这里添加按钮点击逻辑
        });
    }
}

情况2:你想使用FilterBottomSheetFragment作为BottomSheet弹窗

注意到你已经写了FilterBottomSheetFragment这个BottomSheetDialogFragment,这种情况下你不应该在XML中直接引用OrderbookFilterMenu,而是通过代码动态显示这个Fragment:

在你的OrderbookFragment或OrderbookActivity中,添加显示底部弹窗的代码:

// 示例:绑定到某个按钮的点击事件
filterTriggerBtn.setOnClickListener {
    val bottomSheet = FilterBottomSheetFragment()
    bottomSheet.show(childFragmentManager, "FilterBottomSheetTag")
}

同时记得移除主XML中的<...OrderbookFilterMenu>标签,避免两种实现方式冲突。

额外提醒

检查你的主XML中OrderbookFilterMenu的标签路径是否正确,确保包名和类名完全匹配,避免因为路径错误导致的加载失败。

内容的提问来源于stack exchange,提问作者Lukas Schüller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:34:06