ActionBarCompat: java.lang.IllegalStateException: Вам потрібно використовувати Theme.AppCompat


102

Я отримую RuntimeException на Android 2.3.5 , але я буду з допомогою Theme.AppCompat (RES / значення / themes.xml). Це телефон: http://www.gsmarena.com/samsung_galaxy_y_s5360-4117.php

 <!-- res/values/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>

     <style name="Theme.Styled" parent="@style/Theme.AppCompat">
         <item name="actionBarStyle">@style/QueryActionBar</item>
         <item name="android:actionBarStyle">@style/QueryActionBar</item>
     </style>

     <style name="QueryActionBar" parent="@style/Widget.AppCompat.ActionBar">
         <item name="background">@color/blueback</item>
         <item name="android:background">@color/blueback</item>
         <item name="backgroundSplit">@color/blueback</item>
         <item name="android:backgroundSplit">@color/blueback</item>
     </style>

 </resources>

Ось файл для значень-v11.

 <!-- res/values-v11/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@android:style/Theme.Holo">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

Ось помилка.

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.txt2lrn.www/com.txt2lrn.www.LandingActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
 at android.app.ActivityThread.access$1500(ActivityThread.java:117)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:130)
 at android.app.ActivityThread.main(ActivityThread.java:3687)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:507)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
 at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
 at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:102)
 at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98)
 at com.txt2lrn.www.LandingActivity.onCreate(LandingActivity.java:95)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
 ... 11 more

Вибачте, у мене також є android: theme = "@ style / Theme.Styled", визначений в AndroidManifest.xml.


1
Чи є ваша маніфестація Theme.Styled?
CommonsWare

3
у вас є інша папка значень, на яку посилається Theme.Styled, але не використовується тема AppCompat?
tyczj

@tyczj Я додав файл res / values-v11 / themes.xml, і він не посилається на Theme.Styled
AG1

@tyczj Ви можете використовувати ваш коментар як відповідь, оскільки це може бути поширеною проблемою (і я)
Valentino Dell'Aica

Відповіді:


96

Якщо ви розширюєте ActionBarActivity у своїй MainActivity, вам також доведеться змінити батьківську тему у значеннях-v11.
Тож style.xml у значеннях-v11 буде -

 <!-- res/values-v11/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@style/Theme.AppCompat">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

РЕДАКТУВАННЯ. Я рекомендую вам припинити використання ActionBar і почати використовувати макет AppBar, включений у бібліотеку підтримки дизайну Android


5
Відмінно, я пропустив це. Не забувайте також і про всі інші папки -vXX, інакше це буде добре працювати у вашій тестовій програмі, лише щоб вкусити вас, коли хтось використовує одну з цих версій.
falstro

1
Дякую! Щойно змінили ActionBarActivity на активність! :)
Іной

66

Щоб просто додати ActionBar Compat для вашої діяльності чи програми, слід використовувати тему @ style / Theme.AppCompat в AndroidManifest.xml, як це:

   <activity
        ...
        android:theme="@style/Theme.AppCompat" />

Це додасть панель дій у активізації (або всі дії, якщо ви додали цю тему до програми)


Але зазвичай вам потрібно налаштувати панель дій. Для цього вам потрібно створити два стилі з батьком Theme.AppCompat, наприклад, "@ style / Theme.AppCompat.Light". Перший буде для api 11> = (версії Android з вбудованою панеллю дій для Android), другий - для api 7-10 (без вбудованої панелі дій).

Давайте розглянемо перший стиль. Він буде розташований у res / values-v11 / styles.xml . Це буде виглядати приблизно так:

<style name="Theme.Styled" parent="@style/Theme.AppCompat.Light">
    <!-- Setting values in the android namespace affects API levels 11+ -->
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <!-- Setting values in the android namespace affects API levels 11+ -->
    <item name="android:background">@drawable/ab_custom_solid_styled</item>
    <item name="android:backgroundStacked"
      >@drawable/ab_custom_stacked_solid_styled</item>
    <item name="android:backgroundSplit"
      >@drawable/ab_custom_bottom_solid_styled</item>
</style>

І вам потрібно мати однаковий стиль для api 7-10. Він буде розміщений у res / values ​​/ styles.xml , АЛЕ тому, що рівні api ще не знають про оригінальні елементи стилю андроїд-панелі дій, ми повинні використовувати його, що надається бібліотекою підтримки. Елементи ActionBar Compat визначаються так само, як оригінальний андроїд, але без частини "android:" на передній частині:

<style name="Theme.Styled" parent="@style/Theme.AppCompat.Light">
    <!-- Setting values in the default namespace affects API levels 7-11 -->
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <!-- Setting values in the default namespace affects API levels 7-11 -->
    <item name="background">@drawable/ab_custom_solid_styled</item>
    <item name="backgroundStacked">@drawable/ab_custom_stacked_solid_styled</item>
    <item name="backgroundSplit">@drawable/ab_custom_bottom_solid_styled</item>
</style>

Врахуйте, що навіть якщо рівні api вище 10 вже мають панель дій, ви все одно повинні використовувати стилі AppCompat. Якщо ви цього не зробите, у вас виникне помилка при запуску Acitvity на пристроях з Android 3.0 і новішими версіями:

java.lang.IllegalStateException: для цього потрібно використовувати тему Theme.AppCompat (або нащадка).

Ось посилання на цю оригінальну статтю http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html, написану Крісом Бейнсом.

PS Вибачте за мою англійську


прибила його! UPVPTED
tony

20

Перевірте і переконайтеся, що у вас немає іншої папки значень, яка посилається на topic.styled та не використовує тему AppCompat

тобто values-v11папка


Це була і моя проблема. У мене був проект бібліотеки, і мені довелося імпортувати бібліотеку appcompat-v7 і змусити всі теми розширити теми AppCompat. Справа в тому, що в моєму головному проекті опція інструментів: substitu = = "android: icon, android: topic" додана до <застосунку>, і вона повинна залишати стилі інших проектів. Чомусь це не працювало.
speedynomads

16

Спробуйте це...

styles.xml

<resources>
 <style name="Theme.AppCompat.Light.NoActionBar" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
 </style>
</resources>

AndroidManifest.xml

   <activity
        android:name="com.example.Home"
        android:label="@string/app_name" 
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

11

Ваше Activityрозширення ActionBarActivityвимагає AppCompat.themeзастосування. Перейдіть ActionBarActivityна Activityабо FragmentActivity, це вирішить проблему.



3

Мій маніфест не посилається на жодні теми ... це не повинно мати AFAIK

Звичайно, це так. Ніщо магічно не стосується Theme.Styledдіяльності. Вам потрібно заявити про свою діяльність - або всю вашу заявку - Theme.Styledнаприклад, використовуючи:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Styled">

Я був невірним, у мене в AndroidManifest.xml є android: theme = "@ style / Theme.Styled" (я не бачив його вперше).
AG1

3

Я зіткнувся з цією помилкою, коли я намагався створити DialogBox, коли деякі дії були зроблені всередині класу CustomAdapter. Це був не клас діяльності, а клас адаптера. Після 36 годин зусиль і пошуку рішень я придумав це.

Надішліть активність як параметр під час виклику CustomAdapter.

CustomAdapter ca = new CustomAdapter(MyActivity.this,getApplicationContext(),records);

Визначте змінні в користувацькому адаптері.

Activity parentActivity;
Context context;

Викликайте конструктора так.

public CustomAdapter(Activity parentActivity,Context context,List<Record> records){
    this.parentActivity=parentActivity;
    this.context=context;
    this.records=records;
}

І нарешті, створюючи діалогове вікно всередині класу адаптерів, робіть це так.

AlertDialog ad = new AlertDialog.Builder(parentActivity).setTitle("Your title");

and so on..

Я сподіваюся, що це вам допоможе


2

Я просто переходжу програму від ActionBarSherlock до ActionBarCompat. Спробуйте оголосити стару тему так:

<style name="Theme.Event" parent="Theme.AppCompat">

Потім встановіть тему у своєму AndroidManifest.xml:

<application
    android:debuggable="true"
    android:name=".activity.MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Event.Home"
     >

2

У мене стався такий збій на пристроях Samsung, навіть якщо діяльність використовувала Theme.AppCompat . Основна причина була пов'язана з дивними оптимізаціями на стороні Samsung:

- if one activity of your app has theme not inherited from Theme.AppCompat
- and it has also `android:launchMode="singleTask"`
- then all the activities that are launched from it will share the same Theme

Моє рішення було лише видаленням android:launchMode="singleTask"


1
У вас є джерело для цього? Я деякий час відслідковував подібну помилку в моєму додатку, і це звучить як багатообіцяюча роль.
Дмитро Брант

Те ж саме! Хочеться детальніше про це! Я також відслідковував подібну помилку в моєму додатку. На жаль, не використовую android:launchMode="singleTask".
acrespo

Я спостерігаю те саме питання. Це відбувається для Galaxy Tab A 10.1 (Android 7.0, не вкорінений і SM-A320FL (Android 7.0, не вкорінений). Я не використовую android:launchMode="singleTask"і всі мої дії використовують тему AppCompat: /
користувач2990759

2

у моєму випадку я створив спеціальний перегляд, який я додав до конструктора спеціального вигляду

new RoomView(getAplicationContext());

правильний контекст є діяльністю, тому змінив його на:

new RoomView(getActivity());

або

new RoomView(this);

1

Для перегляду списку я використовую спеціальний адаптер, який розширює ArrayAdapter. у listiview у мене є 2 кнопки, одна з кнопок як Custom AlertDialogBox. Наприклад: активність parentActivity; Конструктор для адаптера `

public CustomAdapter(ArrayList<Contact> data, Activity parentActivity,Context context) {
        super(context,R.layout.listdummy,data);
        this.mContext   =   context;
        this.parentActivity  =   parentActivity;
    }

`виклик адаптера від MainActivty

adapter = new CustomAdapter(dataModels,MainActivity.this,this);

тепер напишіть ур-сигнал діалога всередині кнопки ур, яка знаходиться в класі адаптера

viewHolder.update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
            

                AlertDialog.Builder alertDialog =   new AlertDialog.Builder(parentActivity);
                alertDialog.setTitle("Updating");
                alertDialog.setCancelable(false);

                LayoutInflater layoutInflater   = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                 @SuppressLint("InflateParams") final View view1   =   layoutInflater.inflate(R.layout.dialog,null);
                alertDialog.setView(view1);
                alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.cancel();
                    }
                });
                alertDialog.setPositiveButton("Update", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    //ur logic
                            }
                    }
                });
                  alertDialog.create().show();

            }
        });


-2

para резоver o meu problema, eu apenas adicionei na minha MainActivity ("Тема = Щоб вирішити свою проблему, я щойно додав її до своєї MainActivity (" Тема = "@ style / MyTheme" "), де MyTheme - назва моєї теми

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.