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 05

3
у вас есть другая папка значений, которая ссылается на Theme.Styled, но не использует тему AppCompat?
tyczj 05

@tyczj Я добавил разреш / значения-V11 / themes.xml файл и он не ссылается Theme.Styled
AG1

@tyczj Вы можете использовать свой комментарий в качестве ответа, так как это может быть обычная проблема (я тоже)
Валентино Делл'Аика

Ответы:


96

Если вы расширяете ActionBarActivity в своем MainActivity, вам также придется изменить родительскую тему в values-v11.
Таким образом, style.xml в values-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 на Activity! :)
Иной

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 еще не знают об исходных элементах стиля панели действий Android, мы должны использовать один, предоставленный библиотекой поддержки. Элементы ActionBar Compat определяются так же, как и в оригинальном android, но без части "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
Тони

20

Проверьте и убедитесь, что у вас нет другой папки значений, которая ссылается на theme.styled и не использует тему AppCompat.

т.е. values-v11папка


Это тоже была моя проблема. У меня был проект библиотеки, и мне пришлось импортировать библиотеку appcompat-v7 и заставить все темы расширять темы AppCompat. Дело в том, что в моем основном проекте есть опция tools: replace = "android: icon, android: theme", добавленная в <application>, и стили из других проектов должны быть исключены. По какой-то причине это не сработало.
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">

Я ошибся, у меня есть android: theme = "@ style / Theme.Styled" в моем AndroidManifest.xml (я не видел его в первый раз).
AG1

3

Я столкнулся с этой ошибкой, когда пытался создать DialogBox, когда внутри класса CustomAdapter выполнялось какое-то действие. Это был не класс Activity, а класс адаптера. После 36 часов усилий и поиска решений я пришел к этому.

Отправьте Activity как параметр при вызове 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: /
user2990759

2

в моем случае я создал настраиваемое представление, которое добавил в конструктор настраиваемого представления

new RoomView(getAplicationContext());

правильный контекст - это активность, поэтому изменил его на:

new RoomView(getActivity());

или

new RoomView(this);

1

В моем представлении списка я использую специальный адаптер, который расширяет ArrayAdapter. в listiview у меня есть 2 кнопки, одна из кнопок - Custom AlertDialogBox. Пример: Activity 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);

теперь напишите ur alerttdialog внутри кнопки ur, которая находится в классе адаптера

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 resolver o meu проблема, eu apenas adicionei na minha MainActivity ("Theme = Чтобы решить мою проблему, я просто добавил ее в свой MainActivity (" Theme = "@ 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.