Почему я не могу использовать TextInputLayout (из библиотеки поддержки дизайна) без нашей Theme.Appcompat

Я использую 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

Theme.AppCompat является обязательным для Lollipop ниже, поэтому я использовал его в values ​​\ theme.xml.

Но у меня вопрос: почему я не могу использовать тему Material для Lollipop и далее, т.е. когда я использую Theme.Material в values-v21 \ theme.xml, приложение вылетает ... Есть какие-то подсказки по этой проблеме?

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

person zenith    schedule 15.07.2017    source источник
comment
В чем проблема с использованием AppCompat на всех уровнях API, если вы уже заплатили байтами за включение AppCompat в свой проект? Кроме того, вам не придется беспокоиться о values-v21, потому что вы будете везде использовать один и тот же код. Как вы думаете, что вы получите? (Неважно, что AppCompat - это не только панель действий или дизайн материалов, но и включает в себя множество исправлений и функций, начиная с Lollipop и до сих пор, ориентированных на ресурсы.)   -  person Eugen Pechanec    schedule 15.07.2017
comment
Нет проблем с использованием Appcompat, просто любопытно, почему он не работает без него на леденце, поддерживаемом материальным дизайном.   -  person zenith    schedule 18.07.2017


Ответы (2)


Виджеты из библиотеки дизайна полагаются на функции, заимствованные из новейших уровней API Android. Это включает поддержку аутентичного рисования, разрешения цвета и атрибутов, а также использование версий атрибутов платформы AppCompat (таких как colorAccent, colorControlNormal, colorError и т. Д.).

Если ваше приложение уже использует AppCompat для платформ ниже API 21, вы можете безопасно использовать AppCompat выше, включая API 21. Не только это, я призываю вас к этому. Он содержит исправления и функции, перенесенные с еще более новых уровней API.

Избавьтесь от головной боли и не пытайтесь использовать одновременно темы AppCompat и Material, если вы точно не знаете, что делаете.

Если ваше приложение разработано с использованием minSdkVersion 21 и вы решите, что абсолютно не хотите использовать AppCompat, существует ответвление библиотеки Design, которое использует только функции фреймворка.

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

Он по-прежнему использует части библиотеки support-v4 (что совершенно нормально):

Этот проект зависит от support-annotations и трех частей бывшего support-v4: support-compat, support-core-ui и support-core-utils. Все будет задействовано через транзитивные зависимости, и вы, вероятно, в любом случае уже используете некоторые или все эти зависимости.

person Eugen Pechanec    schedule 18.07.2017
comment
Это похоже на ответ на мой вопрос. - person zenith; 19.07.2017
comment
И если я просто хочу использовать Material.Light.NoActionBar.TranslucentDecor для API ›21 только для одного действия? - person Zhigalin - Reinstate CMs; 13.03.2018
comment
@Zhigalin Полупрозрачный декор означает <item name="windowTranslucentStatus">true</item> и <item name="windowTranslucentNavigation">true</item>. Вы можете сделать это в дочерней теме вашего проекта. - person Eugen Pechanec; 13.03.2018
comment
@EugenPechanec, если я его использую, он не компилируется с ошибкой: Error:error: style attribute 'attr/windowTranslucentStatus (aka com.phr.app:attr/windowTranslucentStatus)' not found. и Error:error: style attribute 'attr/windowTranslucentNavigation (aka com.phr.app:attr/windowTranslucentNavigation)' not found. - person Zhigalin - Reinstate CMs; 14.03.2018
comment
@zhigalin отсутствует android: приставка - person Eugen Pechanec; 14.03.2018

Используйте этот стиль для TextInputLayout:

  <style name="MyTheme" parent="Widget.Design.TextInputLayout">
person Vishal Vaishnav    schedule 15.07.2017