Использование Theme.DeviceDefault с AppCompatActivity - PullRequest
0 голосов
/ 23 октября 2018

У меня есть приложение, которое реализовано с AppCompatActivity и тема на основе Theme.AppCompat.Я хотел бы создать вариант того же приложения, но в нем используется тема Theme.DeviceDefault.Когда я меняю тему, я получаю эту ошибку:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

Я подумал о замене всех экземпляров AppCompatActivity на FragmentActivity, но это приводит к поломке многих функций.

Есть ли способ использовать тему Theme.DeviceDefault в приложении, которое использует AppCompatActivity?

1 Ответ

0 голосов
/ 22 июня 2019

Не то, что я знаю, но вы можете рассмотреть следующее:

По мере выпуска новых версий платформы вводятся новые компоненты, например, в соответствии с исходным кодом, похоже, Theme.AppCompat будет работать правильнообрабатывать стили для различных компонентов / ресурсов, которые ранее были недоступны, и устанавливать важные вещи, такие как класс inflater вида <item name="viewInflaterClass">android.support.v7.app.AppCompatViewInflater</item>

Вот почему он использует базовую тему V7 в качестве родителя:

 <style name="Base.Theme.AppCompat" parent="Base.V7.Theme.AppCompat">    

Другой вариант, который я не тестировал, - это детализировать, какие ресурсы есть в теме, которую вы хотите использовать, и скопировать их все, это, конечно, больно.

<!-- The default theme for apps that target API level XX and higher.
     <p>The DeviceDefault themes are aliases for a specific device’s native look and feel. The
     DeviceDefault theme family and widget style family offer ways for you to target your app
     to a device’s native theme with all device customizations intact.</p>
     <p>For example, when you set your app's {@code targetSdkVersion} to XX or higher, this
     theme is applied to your application by default. As such, your app might appear with the
     {@link #Theme_Material Material} styles on one device, but with a different set of styles on
     another device. This is great if you want your app to fit with the device's native look and
     feel. If, however, you prefer to keep your UI style the same across all devices, you should
     apply a specific theme such as {@link #Theme_Material Material} or one of your own design.
     For more information, read <a
     href="http://android-developers.blogspot.com/20XX/XX/material-everywhere.html">Material
     Everywhere</a>.</p>
     <p>Styles used by the DeviceDefault theme are named using the convention
     Type.DeviceDefault.Etc (for example, {@code Widget.DeviceDefault.Button} and
     {@code TextAppearance.DeviceDefault.Widget.PopupMenu.Large}).</p>
      -->
...