我正在尝试使用Material Design(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'}
答案 0 :(得分:20)
这可能只是一个主题问题。如果您的TextInputLayout的父级是MaterialComponents(如下所述)
<style name="TextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
...
</style>
如果您的“活动(或应用程序)”主题派生自AppCompat,则您的应用程序将崩溃,因为MaterialComponents和AppCompat主题不兼容。例如,(活动或App的)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>
希望这可能有效。
答案 1 :(得分:10)
在现有项目中实施 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>
答案 2 :(得分:8)
我在AndroidX中也遇到了同样的错误。我有一个对我有用的解决方案。
使用Theme.AppCompat
样式作为AppTheme或活动,而不是使用Theme.MaterialComponents
。
style.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>
使用Google材料库。
implementation 'com.google.android.material:material:1.2.0'
为什么会出现此问题?
我注意到您正在为TextInputLayout使用自定义样式:style="@style/TextInputLayout"
这应该是@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox
或类似名称。因此,它需要Theme.MaterialComponents
作为Activity的父主题。
答案 3 :(得分:8)
更改您的应用主题以从“材料组件”主题继承
error C2668: 'GetGlobal': ambiguous call to overloaded function.
答案 4 :(得分:5)
谢谢您的回答。
问题是我使用了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'
这解决了我的问题。
答案 5 :(得分:3)
实际上,大多数人关于 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>
答案 6 :(得分:3)
如果在工具测试期间遇到此错误,则可能需要使用其定义样式。
val scenario = launchFragmentInContainer<LoginFragment>(themeResId = R.style.MyTheme)
答案 7 :(得分:2)
在应用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 vector支持。
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
}
希望这可以解决问题。
答案 8 :(得分:1)
这个致命错误的主要原因是 在设置文本输入布局的样式时,非常需要更改应用程序的主题,或者不更改应用程序,然后为特定屏幕创建另一种样式。 这可以通过
转到价值观 然后打开styles.xml
这通常是您的应用主题的样子
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
这里要改变的主要是
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
将appcompat改为material组件
如果您不想更改应用主题
<style name="MaterialAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
我认为这会很好地工作,并帮助您在输入字段中填充轮廓框或任何特定主题。
答案 9 :(得分:1)
只需转到 应用程序> res>值> 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>
答案 10 :(得分: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);
答案 11 :(得分:1)
您应该更改
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);
}
}
答案 12 :(得分:0)
a也有同样的情况。原因是我的依赖项中的“ zoo”))
17.07.2019-正确的列表:
// $modelTimetable[$key]->attributes = $value; //Can be comment
答案 13 :(得分:0)
如果您使用的是com.android.support:design:28.0.0
或更高版本,则库中将不再存在类android.support.design.widget.TextInputLayout
和android.support.design.widget.TextInputEditText
。
如果您使用的是API级别28(或更高版本),则必须使用com.google.android.material:material
库,如此处的其他答案所述。
答案 14 :(得分:0)
通过继承以下内容之一来更新@style文件夹中的主题:
protected void Button1_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AMPRConnectionString"].ConnectionString);
con.Open();
SqlDataReader myReader = null;
SqlCommand myCommand = new SqlCommand("select * from logare where email='" + TextBox1.Text + "'", con);
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("*******", "*****");
MailMessage mailMessage = new MailMessage();
mailMessage.To.Add(TextBox1.Text);
mailMessage.From = new MailAddress("******");
mailMessage.Subject = ("Password recoverd");
mailMessage.Body = "Dear " + TextBox1.Text + ", Your Password is "+ ? ;
client.Send(mailMessage);
ScriptManager.RegisterStartupScript(this, this.GetType(), "popup", "alert('Email has been sent succesfully !');", true);
}
catch (Exception ex)
{
Response.Write("Could not send email" + ex.Message);
}
}
像这样:
Theme.MaterialComponents
Theme.MaterialComponents.NoActionBar
Theme.MaterialComponents.Light
Theme.MaterialComponents.Light.NoActionBar
Theme.MaterialComponents.Light.DarkActionBar
答案 15 :(得分:0)
当我在应用程序级别相关性中使用的是1.2.0-alpha06版本的材料设计时,发生了此错误,这是新版本。 我不得不将其放回1.0.0-beta01版本,并且运行良好。
答案 16 :(得分:0)
我遇到了同样的错误,因为我将Gradle Build中的依赖项更改为
implementation 'com.google.android.material:material:1.2.1'
然后我将其还原为
> implementation 'com.google.android.material:material:1.0.0'
错误消失。
答案 17 :(得分:0)
按照here列出的所有这些步骤进行操作之后,我仍然面临着相同的渲染问题,但是我决定在设备上实际启动该应用程序以查看会发生什么,
即使Android Studio中的预览将材质组件显示为常规EditText并显示多个警告,它仍在实际设备上正确呈现。
因此,为了省去人们在一段时间内搜索该错误的时间(对我来说这是一个小时的浪费),只需在设备上尝试一下!
答案 18 :(得分: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>
答案 19 :(得分:0)
如果您在项目中使用常规样式,并且在使用材质组件,则使用更新后的样式
// 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>
只需很小的改动,您就会得到结果...
答案 20 :(得分:0)
在您的依赖项中添加:
implementation 'com.android.support:design:27.0.0'
希望它可以帮助您..尝试一下..
答案 21 :(得分:0)
别忘了在所有样式为Theme.MaterialComponents的活动上的清单文件中也进行更改
答案 22 :(得分:0)
这个问题只是因为主题选择。
我们可以在 XML 文件中使用 Theme.MaterialComponents.DayNight.DarkActionBar
例如:android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar"
答案 23 :(得分:0)
将styles.xml 文件中应用程序的样式更改为:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
<!-- Customize your theme here. -->
</style>
这对我有用
答案 24 :(得分: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'
}