Android Studio为TextInputLayout添加hint出现渲染问题如何解决
TextInputLayout设置hint后布局预览渲染报错
问题现象
在Android Studio中为TextInputLayout添加hint属性时,布局预览出现渲染报错,移除该属性后预览恢复正常。
- 报错预览效果:

- 移除hint后的正常预览效果:

错误堆栈
java.lang.IllegalArgumentException: width and height must be > 0 at android.graphics.Bitmap.createBitmap(Bitmap.java:1113) at android.graphics.Bitmap.createBitmap(Bitmap.java:1080) at android.graphics.Bitmap.createBitmap(Bitmap.java:1030) at android.graphics.Bitmap.createBitmap(Bitmap.java:991) at com.google.android.material.textfield.CutoutDrawable.drawStrokeShape(CutoutDrawable.java:100) at com.google.android.material.shape.MaterialShapeDrawable.draw(MaterialShapeDrawable.java:974) at com.google.android.material.textfield.CutoutDrawable.draw(CutoutDrawable.java:89) at android.graphics.drawable.LayerDrawable.draw(LayerDrawable.java:1018) at android.view.View.drawBackground(View.java:22581) at android.view.View.draw_Original(View.java:22342) at android.view.View_Delegate.draw(View_Delegate.java:56) at android.view.View.draw(View.java:22323) at android.view.View.draw_Original(View.java:22223) at android.view.View_Delegate.draw(View_Delegate.java:68) at android.view.View.draw(View.java:21995) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.draw_Original(View.java:22221) at android.view.View_Delegate.draw(View_Delegate.java:68) at android.view.View.draw(View.java:21995) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.draw_Original(View.java:22353) at android.view.View_Delegate.draw(View_Delegate.java:56) at android.view.View.draw(View.java:22323) at com.google.android.material.textfield.TextInputLayout.draw(TextInputLayout.java:4078) at android.view.View.draw_Original(View.java:22223) at android.view.View_Delegate.draw(View_Delegate.java:68) at android.view.View.draw(View.java:21995) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1994) at android.view.View.draw_Original(View.java:22221) at android.view.View_Delegate.draw(View_Delegate.java:68) at android.view.View.draw(View.java:21995) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.draw_Original(View.java:22353) at android.view.View_Delegate.draw(View_Delegate.java:56) at android.view.View.draw(View.java:22323) at android.widget.ScrollView.draw(ScrollView.java:1833) at android.view.View.draw_Original(View.java:22223) at android.view.View_Delegate.draw(View_Delegate.java:68) at android.view.View.draw(View.java:21995) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1994) at android.view.View.draw_Original(View.java:22221) at android.view.View_Delegate.draw(View_Delegate.java:68) at android.view.View.draw(View.java:21995) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.draw_Original(View.java:22221) at android.view.View_Delegate.draw(View_Delegate.java:68) at android.view.View.draw(View.java:21995) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.draw_Original(View.java:22221) at android.view.View_Delegate.draw(View_Delegate.java:68) at android.view.View.draw(View.java:21995) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.draw_Original(View.java:22353) at android.view.View_Delegate.draw(View_Delegate.java:56) at android.view.View.draw(View.java:22323) at com.android.layoutlib.bridge.impl.RenderSessionImpl.renderAndBuildResult(RenderSessionImpl.java:553) at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:450) at com.android.layoutlib.bridge.BridgeRenderSession.render(BridgeRenderSession.java:120) at com.android.ide.common.rendering.api.RenderSession.render(RenderSession.java:137) at com.android.ide.common.rendering.api.RenderSession.render(RenderSession.java:119) at com.android.tools.idea.rendering.RenderTask.lambda$null$12(RenderTask.java:992) at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:174) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834)
复现用布局代码
<com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout2" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu" android:layout_width="250dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:hint="@string/convert_from" app:boxCornerRadiusBottomEnd="100dp" app:boxCornerRadiusBottomStart="100dp" app:boxCornerRadiusTopEnd="100dp" app:boxCornerRadiusTopStart="100dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView"> <AutoCompleteTextView android:id="@+id/convertFromAutoCompleteTextView" android:layout_width="250dp" android:layout_height="match_parent" android:layout_weight="1" android:fontFamily="@font/poppins_medium" android:inputType="none" android:text="@string/kilogram_kg" /> </com.google.android.material.textfield.TextInputLayout>
已尝试无效的方案
- 重新构建项目
- 重启Android Studio
- 执行Invalidate Caches/Restart清除缓存并重启
- 按照Android Studio提示刷新布局
问题原因
该问题是Material组件库旧版本的IDE布局预览专属bug,触发条件为:使用OutlinedBox系列TextInputLayout样式、同时设置了超大圆角(示例中四个角均设为100dp的完全圆角)+ 配置hint属性。渲染时CutoutDrawable计算hint文字的边框缺口尺寸时拿到了0值,触发Bitmap创建时宽高必须大于0的校验异常。该异常仅出现在IDE预览阶段,不会影响真机/模拟器的实际运行效果。
解决方案
- 升级Material依赖:将模块build.gradle中引入的
com.google.android.material:material依赖升级到1.7.0及以上稳定版本,新版本已修复该大圆角+hint触发的预览渲染问题。 - 固定输入框高度:如果暂时不想升级依赖,可以给TextInputLayout设置固定高度(比如Material Design规范推荐的56dp),避免渲染时尺寸计算拿到0值。
- 临时预览规避:开发阶段可以临时把圆角值调小(比如20dp)完成布局调整,正式打包前改回目标圆角值即可,真机运行不会触发该报错。
内容的提问来源于stack exchange,提问作者Belal Ahmed
相关产品推荐
相关产品推荐

