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

为何WindowManager计算的dimen值一调用就导致App崩溃?

问题解决:使用计算的尺寸值导致App崩溃

核心崩溃原因

你代码里的Toast.makeText(MainActivity.this,dimen,Toast.LENGTH_SHORT).show()直接把int类型的dimen传给了第二个参数,而Toast.makeText的第二个参数如果是int,会被系统当作字符串资源ID去查找。你的dimen是计算出来的屏幕尺寸值(比如1080*3/4=810),这个数值并不是有效的字符串资源ID,系统找不到对应资源就会抛出Resources.NotFoundException,直接导致崩溃。

你提到去掉Toast后其他用dimen的操作也崩溃,大概率是其他地方也犯了同样错误——把这个int值当成资源ID来使用(比如调用setText(dimen)这类需要资源ID的方法)。

修复步骤

1. 修复Toast调用

要显示dimen的数值,需先把它转换成字符串:

Toast.makeText(MainActivity.this, String.valueOf(dimen), Toast.LENGTH_SHORT).show();

2. 替换过时的屏幕尺寸获取方式

你用WindowManager获取尺寸的写法已过时,推荐用更现代的实现:

// 获取应用可用区域(不含状态栏、导航栏)
WindowMetrics windowMetrics = getWindowManager().getCurrentWindowMetrics();
Insets insets = windowMetrics.getWindowInsets()
        .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars());
int usableWidth = windowMetrics.getBounds().width() - insets.left - insets.right;
int usableHeight = windowMetrics.getBounds().height() - insets.top - insets.bottom;

dimen = Math.min(usableWidth, usableHeight) * 3 / 4;

3. 规范跨组件传值方式

不要用public变量暴露dimen,推荐通过getter方法在Fragment中获取:

  • 在MainActivity中添加getter:
public int getQrCodeDimension() {
    return dimen;
}
  • 在Fragment的onViewCreated中安全调用(确保Activity已初始化):
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (getActivity() instanceof MainActivity) {
        int qrDimen = ((MainActivity) getActivity()).getQrCodeDimension();
        // 示例:设置ImageView尺寸
        imageView.setLayoutParams(new ViewGroup.LayoutParams(qrDimen, qrDimen));
    }
}

4. 排查其他崩溃点

如果去掉Toast后仍崩溃,检查所有使用dimen的代码:

  • 禁止把dimen传给需要资源ID的方法(比如setText(int resId)、setBackgroundResource(int resId))
  • 直接用dimen作为像素值设置View尺寸是安全的,比如view.getLayoutParams().width = dimen;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:30:49