使用 TextInputLayout 时的膨胀异常



我正在尝试使用材料设计(https://github.com/material-components/material-components-android/blob/master/docs/components/TextInputLayout.md)中的TextInputEditText,但遇到运行时异常。

这是运行日志的一部分:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.grigori.materialtextedit, PID: 12036
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.grigori.materialtextedit/com.example.grigori.materialtextedit.MainActivity}: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class com.google.android.material.textfield.TextInputLayout
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class com.google.android.material.textfield.TextInputLayout
Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class com.google.android.material.textfield.TextInputLayout
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.material.textfield.TextInputLayout" on path: DexPathList

我通过 DexPathList 剪切了此日志,其中包含许多指向 apk 文件的路径,例如:

zip file "/data/app/com.example.grigori.materialtextedit-jamgTcrgG9neBKIMcqDo7Q==/base.apk"

我的 xml 文件:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_text"/>
</com.google.android.material.textfield.TextInputLayout>

我的build.gradle依赖项:

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'}     

在我现有的项目中实现AndroidX时遇到了这个问题。

implementation 'com.google.android.material:material:1.0.0-beta01'

布局 XML

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/userNameWrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/TextLabel">

旧式

<style name="TextLabel" parent="TextAppearance.AppCompat">
<item name="android:textColorHint">@color/hint_color</item>
<item name="android:textSize">@dimen/text_20sp</item>
<item name="colorControlNormal">@color/primaryGray</item>
<item name="colorControlActivated">@color/colorPrimary</item>
</style>

新风格

<style name="TextLabel" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
<item name="android:textColorHint">@color/hint_color</item>
<item name="android:textSize">@dimen/text_20sp</item>
<item name="colorControlNormal">@color/primaryGray</item>
<item name="colorControlActivated">@color/colorPrimary</item>
</style>

通过继承以下内容之一来更新文件夹中@style主题:

Theme.MaterialComponents
Theme.MaterialComponents.NoActionBar
Theme.MaterialComponents.Light
Theme.MaterialComponents.Light.NoActionBar
Theme.MaterialComponents.Light.DarkActionBar

喜欢这个:

<style name="AppTheme.NoActionBar"    parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimaryCustom</item>
<item name="colorPrimaryDark">@color/colorPrimaryDarkCustom</item>
<item name="colorAccent">@color/colorAccentCustom</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

这可能只是一个主题问题。如果 TextInputLayout 的父级是 MaterialComponents(如下所述)

<style name="TextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
...
</style>

如果您的活动(或应用)主题派生自 AppCompat,您的应用将崩溃,因为 MaterialComponents 和 AppCompat 主题不兼容。例如,应用程序主题(用于活动或应用程序)不能如下所示:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

您还必须将应用程序主题设置为材质组件,如下所示:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

希望这可能会奏效。

感谢您的回答。 问题是我用了com.google.android.material.textfield.TextInputLayout.如果使用此控件,则应添加依赖项:

implementation 'com.google.android.material:material:1.0.0-beta01'

就我而言,我在android.support.design.widget.TextInputLayout上重写了我的 xml:

<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="@color/colorPrimary"
app:errorEnabled="true">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimary"
android:textColorHint="@color/colorPrimary"
android:hint="Username" />
</android.support.design.widget.TextInputLayout>

另外,我还添加了依赖项:

implementation 'com.android.support:design:27.1.1'

这解决了我的问题。

我在AndroidX中也遇到了同样的错误。我有一个对我有用的解决方案。

不要使用Theme.AppCompat,而是使用Theme.MaterialComponents样式作为 AppTheme 或用于活动。

风格.xml

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

使用谷歌材质库。

implementation 'com.google.android.material:material:1.2.0'

为什么会出现此问题?

我注意到您正在为您使用自定义样式 文本输入布局 :style="@style/TextInputLayout"

这应该是@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox或类似的。因此,它需要Theme.MaterialComponents作为活动上的父主题。

实际上,大多数人对应用程序主题的说法是不正确的!

如果您使用的是androidx并且不想拥有 MaterialComponents 应用程序主题

<!--style name="AppTheme" parent="Theme.MaterialComponents..."-->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

您始终可以执行以下操作,并仅将材质组件主题添加到父容器:

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:theme="@style/Theme.MaterialComponents">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/performing_attr1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Label"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"/>
</com.google.android.material.textfield.TextInputLayout>

将应用主题更改为从材质组件主题继承

<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight">
<!-- ... -->
</style>

在应用 Gradle 中添加此依赖项

implementation 'com.google.android.material:material:1.1.0-alpha09'

在样式中添加此样式.xml用于文本输入布局

<style name="TextLabel" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
<item name="android:textColorHint">@color/colorGray600</item>
<item name="android:textSize">@dimen/text_20sp</item>
<item name="colorControlNormal">@color/colorGray900</item>
<item name="colorControlActivated">@color/colorPrimary</item>
</style>

像这样在 TextInputLayout 中添加它

android:theme="@style/TextLabel"

并确保您已使用正确的主题作为父主题,如下所示

Theme.MaterialComponents.Light

现在这将解决膨胀异常问题。 但是,如果您有矢量可绘制对象,请按照下面的步骤操作

1. 您需要在应用的build.gradle中选择加入 AndroidX 矢量支持:

android {
...
defaultConfig {
...
vectorDrawables.useSupportLibrary = true
} }

2.如果您想以声明方式设置可绘制对象(即在您的布局中),那么 appcompat 提供了许多您应该使用的 *Compat 属性,而不是标准平台属性:

ImageView, ImageButton:

不要:android:src做:app:srcCompat

CheckBox, RadioButton:

不要:android:button做:app:buttonCompatTextView(截至appcompat:1.1.0): 不要:android:drawableStart android:drawableTop等。 做:app:drawableStartCompat app:drawableTopCompat

由于这些属性是 appcompat 库的一部分,因此请务必使用 app: 命名空间。在内部,这些 AppCompat* 视图使用 AppCompatResources 本身来启用加载向量。

3.如果您想使用内部代码,那么

val drawable = AppCompatResources.getDrawable(context, R.drawable.my_vector)

**4.**如果您使用的是数据绑定,则可以使用自定义绑定适配器完成此操作:

/* Copyright 2018 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
@BindingAdapter("indeterminateDrawableCompat")
fun bindIndeterminateProgress(progressBar: ProgressBar, @DrawableRes id: Int) {
val drawable = AppCompatResources.getDrawable(progressBar.context, id)
progressBar.indeterminateDrawable = drawable
}

希望这将解决问题。

如果在插桩测试期间遇到此错误,则可能需要定义样式。val scenario = launchFragmentInContainer<LoginFragment>(themeResId = R.style.MyTheme)

此致命错误的主要原因是 在设置文本输入布局的样式时,非常需要更改应用程序的主题,或者不更改应用程序,然后为特定屏幕创建另一种样式。 这可以通过以下方式完成

转到值 然后打开样式.xml

这通常是您的应用程序主题的样子

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

这里要更改的主要内容是

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">

将应用更改为材料组件

如果您不想更改应用程序主题

<style name="MaterialAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">

我认为这将正常工作,并帮助您膨胀输入字段中的轮廓框或任何特定主题。

你应该改变

build.gradle file in

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
testImplementation 'junit:junit:4.12'
implementation 'com.google.android.material:material:1.0.0-beta01'
}

XML 文件中的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:focusable="false"
android:clickable="true">

<LinearLayout
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
style="@style/TextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="UserName"
android:layout_margin="15dp">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
style="@style/TextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:layout_margin="15dp">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
style="@style/TextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:layout_margin="15dp">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>

</LinearLayout>
</RelativeLayout>

主活动.java

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

如果您使用的是com.android.support:design:28.0.0或更高版本,则库中将不再存在类android.support.design.widget.TextInputLayoutandroid.support.design.widget.TextInputEditText

如果您使用的是 API 级别 28(或更高版本),则必须使用com.google.android.material:material库,如此处的其他答案所述。

我得到了同样的错误,因为我将 Gradle Build 中的依赖项更改为

implementation 'com.google.android.material:material:1.2.1'

然后我将其恢复为

> implementation 'com.google.android.material:material:1.0.0'

并且错误消失了。

"app:passwordToggleEnabled="true" or app:passwordToggleTint="#fff"处于com.google.android.material.textfield.TextInputLayout中时,将
引发此错误。

通过删除,它可以工作。

可以通过编程方式设置它:

TextInputLayout input_password_layout=(TextInputLayout)findViewById(R.id.input_password_layout);
input_password_layout.setPasswordVisibilityToggleEnabled(true);
input_password_layout.setPasswordVisibilityToggleDrawable(R.drawable.back);

<</div> div class="one_answers">a 也有同样的情况。 原因是在我的依赖项中的"动物园"中))

17.07.2019 - 正确列表:

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.android.material:material:1.0.0'

只需转到 应用程序> res>值>样式.xml 并将主题更改为:"主题.材料组件.光.暗行动栏" 它会看起来像这样——

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

如果您在项目中使用常规样式并且正在使用材质组件,请使用更新的样式

// Old Style
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:fontFamily">@font/roboto_regular</item>
</style>
// Updated Style
<style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:fontFamily">@font/roboto_regular</item>
</style>

只是很小的变化,你就会得到结果...

将此行添加到样式文件中,编辑样式名称以匹配您的样式名称

<style name="Theme.MyAppName" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">

还要确保清单文件主题中的活动指向

android:theme="@style/Theme.MyAppName"

除此之外,我最近出现了相同的错误,没有任何明显的代码更改。

事实证明,我的组件在TextInputEditText上有一个主题,缺少以下两项:

<item name="android:textColorHighlight">@color/colorPrimary</item>
<item name="android:textColorLink">@color/colorPrimary</item>

在依赖项中添加:

implementation 'com.android.support:design:27.0.0'

希望它对您有所帮助..尝试一下..

你应该添加

implementation 'com.github.material-components:material-components-android:1.0.0-rc01'

到依赖项部分中的 build.gradle 应用级别,使其如下所示:

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.github.material-components:material-components-android:1.0.0-rc01'
}  

按照此处列出的所有这些步骤操作后,我仍然面临相同的渲染问题,但我决定在设备上实际启动应用程序以查看会发生什么,

尽管Android Studio中的预览将材质组件显示为常规EditText并显示多个警告,但它在实际设备上正确呈现。

因此,为了节省人们在谷歌上搜索此错误的时间(对我来说浪费了一个小时),只需在设备上尝试一下!

当我在应用程序级依赖项中使用版本 1.2.0-alpha06 的材料设计时,此错误发生在我身上,这是新版本。 我不得不把它放回 1.0.0-beta01 版,它运行良好。

试试这个

<style name="FloatingTextStyle" parent="Widget.Design.TextInputLayout">
<!-- Hint color and label color in FALSE state -->
<item name="android:textColorHint">@android:color/darker_gray</item>
<item name="android:textSize">20sp</item>
<!-- Label color in TRUE state and bar color FALSE and TRUE State -->
<item name="colorAccent">@color/colorPrimaryDark</item>
<item name="colorControlNormal">@color/colorPrimaryDark</item>
<item name="colorControlActivated">@color/colorPrimaryDark</item>
</style>

不要忘记将所有具有样式的活动的清单文件更改为 Theme.MaterialComponents

这个问题只是因为主题选择。

我们可以在XML文件中使用Theme.MaterialComponents.DayNight.DarkActionBar

例如:android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar"

将styles.xml 文件中应用的样式更改为:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
<!-- Customize your theme here. -->
</style>

这对我有用

将构建 gradle 依赖项添加为:

implementation 'com.google.android.material:material:1.5.0'

对于主题.xml或样式,您应该有这样的东西

<style name="NoActionBarTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">

就我而言,这是因为我试图将textColorHint设置为attrs.xml中定义的自定义属性。我不知道为什么,但这在材料组件版本 1.5.0 中失败了。删除该位后,它再次工作。

我遇到了同样的问题。错误是由以下行引起的:app:startIconTint="@color/material_dynamic_neutral30

删除后,错误消失了。

文本输入布局:

<com.google.android.material.textfield.TextInputLayout
...
app:startIconTint="@color/material_dynamic_neutral30">
<com.google.android.material.textfield.TextInputEditText
... />
</com.google.android.material.textfield.TextInputLayout>

相关内容

  • 没有找到相关文章

最新更新