为何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
相关产品推荐
相关产品推荐

