0

Я видел похожие вопросы с решениями, которые решают мою проблему, но мне было интересно, может ли кто-нибудь объяснить это мне.Почему инструкции Google для Material Design неверны?

Я следую инструкциям на веб-сайте разработчика Google, чтобы применить тему дизайна материалов, расположенную here. Тем не менее, я получаю IllegalStateException, когда пытаюсь запустить приложение на эмуляторе. Моя тема наследуется от parent="android:Theme.Material", как указано в инструкциях, предоставленных Google.

Вопрос решается путем использования Theme.AppCompat. Почему инструкции, которые предоставляет Google, приводят к ошибке? Я читал, что Theme.AppCompat extends Theme.Material, я не знаю, правда ли это. Почему нельзя использовать тему.Материал?

Я пробовал линию расширения для Theme.AppCompat, но я не видел, чтобы она наследовала от Theme.Material в любом месте.

+0

Не могли бы вы предоставить трассировку стека? Или вы могли бы рассказать мне, какой родитель вы используете для своей деятельности? –

+0

Если вы считаете, что контент является вводящим в заблуждение и явным образом неправильным, вы должны отправить билет на этот сайт. Ты спрашиваешь на другом сайте моего друга. – Enzokie

+0

Вы должны использовать 'Theme.AppCompat' из-за своего' minSdkVersion', который меньше, чем тот, который представил «Theme.Material» (API-уровень 21): см. Примечание на [этой странице] (https: // developer.android.com/training/material/theme.html) –

ответ

2

Почему инструкции, которые предоставляет Google, приводят к ошибке?

Инструкции предполагают, что вы используете Activity, не AppCompatActivity, в качестве базового класса для вашей деятельности. В вашем случае вы используете AppCompatActivity.

Я прочитал, что Theme.AppCompat расширяет Theme.Material, я не знаю, правда ли это.

Это неправда.

На устройствах Android 5.0+ Theme.AppCompat будет распространяться на Theme.Material, косвенно. На старых устройствах этого не произойдет, поскольку Theme.Material не существует. Ваша ошибка исходит от AppCompatActivity, которая подтверждает, что вы используете тему, которая основана на Theme.AppCompat и поэтому не принимает Theme.Material.

+0

Они должны были упомянуть об этом, если честно. Изменив это, он определенно избавился от ошибки. Так в чем же разница между двумя, кроме Activity, являющимися базовым классом? Каков правильный способ применения Material Design к приложению. Кажется, что вы можете использовать виджеты Material Design с AppCompatActivity. – Courtney

+0

@Courtney: «Они должны были упомянуть об этом, если честно» - качество документации меняется. «Так в чем же разница между двумя, кроме Activity, являющейся базовым классом?» - 'Theme.Material' является родным для Android 5.0+ и не существует на старых устройствах. 'appcompat-v7' (' AppCompatActivity', 'Theme.AppCompat' и т. д.) являются backport панели действий и эстетики Material Design, которая работает с API уровня 7 (Android 2.1). «Каков правильный способ применения Material Design к приложению» - «правильный», как красота, лежит в глазах смотрящего. Любой подход может работать. – CommonsWare

+0

Знаете ли вы, что потеряете какие-либо функциональные возможности, виджеты или свойства вида, используя тему Theme.AppCompat и активность AppCompatActivity для устройств Android 5.0+? – Courtney

1

Возможно, у вас есть один (или все) из двух этих задач:

1) Вы можете использовать только один XML-файл style.xml, где ваш написал что-то вроде:

<style name="AppTheme" parent="Theme.Material"> 

И тогда вы бежите приложение для устройства с api ниже 21. Тогда у вас возникла проблема, что устройства с api < 21 не знают о вашей материальной теме.

2) Вы используете тему материала для api> = 21 и AppCompat для api < 21, но ваша деятельность расширяет AppCompatActivity, тогда у вас есть проблема. Поскольку AppCompatActivity требует AppCompat темы, а не материальный

Пожалуйста, посмотрите на this answer для получения более подробной информации Кроме того, из официальной документации page о AppCompatActivity:

Базовый класс для деятельности, которые используют действие штриховые функции библиотеки поддержки.

Вы можете добавить ActionBar в свою деятельность при запуске на уровне API 7 или выше, расширив этот класс для своей активности и установив тему активности Theme.AppCompat или аналогичную тему.

+0

Спасибо за ссылку, я думаю, я понимаю, что они намеревались делать. Я не понимаю, почему они дали нам интерфейс к Theme.Material, если они знали, что это будет проблемой. Они могли бы просто открыть нам AppCompatActivity с помощью библиотеки appcompat и нарисовать ее на Material Design, если вы поймете, что я имею в виду. Спасибо в любом случае :) – Courtney

+0

Это «обратная совместимость». Это главный якорь для всех этих изменений в api, которые кажутся вам глупыми или для меня :) Это основная причина, почему в android есть более 9000 «поддержки» -дупликации классов. –

Смежные вопросы