为什么我不能使用TextInputLayout(来自支持设计库)和Theme.Appcompat

时间:2017-07-15 10:32:32

标签: android material-design android-textinputlayout android-support-design

我正在使用TextInputLayout,如下所示

<android.support.design.widget.TextInputLayout
    android:id="@+id/text_input_layout_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edit_text_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint_full_name"
        android:inputType="text" />
</android.support.design.widget.TextInputLayout>

如果我的应用使用Theme.AppCompat

,代码可以正常工作

以下Lollipop强制使用Theme.AppCompat是有效的,因此我在values \ theme.xml中使用它。

但我的问题是为什么我不能在Lollipop之前使用Material主题,即当我在values-v21 \ theme.xml中使用Theme.Material时,应用程序崩溃.... 关于这个问题的任何线索?

<style name="MyTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
应用程序下面的

与RuntimeException崩溃 在膨胀时,我得到他的二进制膨胀错误XML

Caused by: java.lang.RuntimeException: Failed to resolve attribute at index 18
        at android.content.res.TypedArray.getColor(TypedArray.java:401)
        at android.support.design.widget.CollapsingTextHelper.setCollapsedTextAppearance(CollapsingTextHelper.java:166)
        at android.support.design.widget.TextInputLayout.<init>(TextInputLayout.java:106)
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
        at android.view.LayoutInflater.createView(LayoutInflater.java:607)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
        at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:381)
        at android.app.Activity.setContentView(Activity.java:2144)
        at com.example.trybindinglib.MainActivity.onCreate(MainActivity.java:24)
        at android.app.Activity.performCreate(Activity.java:5933)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2407)
        at android.app.ActivityThread.access$800(ActivityThread.java:149)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:211)
        at android.app.ActivityThread.main(ActivityThread.java:5321)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

2 个答案:

答案 0 :(得分:1)

设计库中的小部件依赖于从Android的最新API级别向后移植的功能。这包括支持真实的可绘制,颜色和属性分辨率以及使用AppCompat版本的平台属性(例如colorAccentcolorControlNormalcolorError等。)

如果您的应用已将AppCompat用于API 21以下的平台,您可以安全地使用上面的AppCompat,也包括API 21。不仅如此,我鼓励你。它包含从更新的API级别向后移植的错误修正和功能。

让您自己头疼,不要同时尝试同时使用AppCompat和Material主题,除非您确切知道自己在做什么。

如果你的应用程序是用minSdkVersion 21设计的,并且你决定绝对不想使用AppCompat,那么设计库的一个分支只使用框架功能。

https://github.com/commonsguy/cwac-crossport

它仍然使用support-v4库的一部分(完全没问题):

  

此项目取决于support-annotations和前support-v4的三个部分:support-compatsupport-core-uisupport-core-utils。所有这些都将通过传递依赖关系引入,并且您可能已经在使用部分或全部依赖关系。

答案 1 :(得分:0)

将此样式用于TextInputLayout:

  <style name="MyTheme" parent="Widget.Design.TextInputLayout">