48

我正在尝试使用 Material Design 中的 TextInputEditText (https://github.com/material-components/material-components-android/blob/master/docs/components/TextInputLayout.md)并且我遇到了运行时异常。

这是运行日志的一部分:

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'}     
4

28 回答 28

47

Faced this issue when implementing AndroidX in my existing project.

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

Layout 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">

Old Style

<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>

New 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>
于 2018-12-07T08:56:05.553 回答
33

通过继承以下内容之一来更新 @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>
于 2019-05-06T10:47:26.097 回答
24

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

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

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

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

您还必须将 AppTheme 设置为 MaterialComponents,如下所示:

<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>

希望这可能会奏效。

于 2020-01-31T13:17:23.073 回答
15

谢谢你的回答。问题是我使用了com.google.android.material.textfield.TextInputLayout. 如果你使用这个控件,你应该添加你的依赖项:

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

就我而言,我在以下位置重写了我的 xml android.support.design.widget.TextInputLayout

    <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'

这解决了我的问题。

于 2018-08-23T09:03:58.317 回答
13

我在 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'

为什么会出现这个问题?

我注意到您正在为您使用自定义样式 TextInputLayout :style="@style/TextInputLayout"

这应该是@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox或类似的。所以它需要Theme.MaterialComponents作为 Activity 的父主题。

于 2020-07-21T13:21:36.787 回答
9

实际上,大多数人对AppTheme的说法是不正确的!

如果您正在使用androidx并且不想拥有 MaterialComponents AppTheme

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

您始终可以执行以下操作并将 MaterialComponents 主题仅添加到父容器:

        <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>
于 2020-11-02T20:57:03.530 回答
8

将您的应用主题更改为从 Material Components 主题继承

<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight">
   <!-- ... -->
</style>
于 2020-02-04T13:11:24.377 回答
5

在应用程序 Gradle 中添加此依赖项

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

在 style.xml 中为您的 TextInputLayout 添加此样式

<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

现在这将解决 InflateException 问题。但如果您有矢量可绘制对象,请按照以下步骤操作

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

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

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

ImageView, ImageButton:

不要:android:src 做:app:srcCompat

CheckBox, RadioButton:

不要:android:button 做:(app:buttonCompat TextView截至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
}

希望这能解决问题。

于 2019-08-04T13:08:07.423 回答
4

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

转到值,然后打开 styles.xml

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

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

这里要改变的主要是

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

将 appcompat 更改为材质组件

如果您不想更改应用主题

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

我认为这会很好,并帮助您在输入字段中填充轮廓框或任何特定主题。

于 2021-04-16T06:56:11.687 回答
3

你应该改变

build.gradle 文件在

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>

MainActivity.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);
    }
}
于 2018-11-29T12:47:38.993 回答
3

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

于 2020-07-17T01:19:46.893 回答
3

如果您正在使用com.android.support:design:28.0.0或更新,则这些类android.support.design.widget.TextInputLayout不再android.support.design.widget.TextInputEditText存在于库中。

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

于 2019-06-12T03:11:46.560 回答
2

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

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

然后我将其恢复为

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

并且错误消失了。

于 2020-09-07T13:44:58.577 回答
1

只需转到 app > res > values > styles.xml 并将主题更改为:“Theme.MaterialComponents.Light.DarkActionBar” 它看起来像这样 -

<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>
于 2020-10-18T06:06:19.630 回答
1

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'
于 2019-07-17T07:46:26.407 回答
1


"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);
于 2018-12-02T07:51:32.510 回答
1

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

   // 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>

只需一点点改变,你就会得到结果......

于 2020-10-21T12:52:05.433 回答
0

不要忘记在样式为 Theme.MaterialComponents 的所有活动的清单文件中也进行更改

于 2020-12-11T09:34:32.717 回答
0

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

于 2020-05-25T21:55:08.643 回答
0

在您的依赖项中添加:

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

希望对你有帮助。。试试吧。。

于 2018-08-21T22:24:17.637 回答
0

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

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

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

于 2018-09-25T14:42:20.393 回答
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'
    }  
于 2018-08-21T22:08:10.377 回答
0

尝试这个

    <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>
于 2020-10-19T11:54:37.003 回答
0

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

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

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

于 2021-02-23T09:58:34.870 回答
0

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

原来我的组件在 TextInputEditText 上有一个主题,但缺少以下两项:

<item name="android:textColorHighlight">@color/colorPrimary</item>
<item name="android:textColorLink">@color/colorPrimary</item>
于 2021-10-20T15:06:29.050 回答
0

将构建 gradle 依赖项添加为:

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

对于 theme.xml 或 style 你应该有这样的东西

<style name="NoActionBarTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
于 2021-10-22T21:41:38.767 回答
0

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

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

</style>

这对我有用

于 2021-04-07T05:09:56.073 回答
0

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

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

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

android:theme="@style/Theme.MyAppName"
于 2021-10-12T06:44:44.760 回答