ActionBarCompat:java.lang.IllegalStateException:您需要使用Theme.AppCompat


102

我在Android 2.3.5上遇到RuntimeException,但正在使用Theme.AppCompat(res / values / 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

抱歉,我也确实在AndroidManifest.xml中定义了android:theme =“ @ style / Theme.Styled”。


1
您的清单是否参考Theme.Styled
CommonsWare 2013年

3
您是否有另一个引用Theme.Styled但不使用AppCompat主题的values文件夹?
tyczj 2013年

@tyczj我已经添加了res / values-v11 / themes.xml文件,它没有引用Theme.Styled
AG1

@tyczj您可以使用您的评论作为答案,因为这可能是一个常见问题(我也是)
Valentino Dell'Aica 2013年

Answers:


96

如果要在MainActivity中扩展ActionBarActivity,则还必须在values-v11中更改父主题。
因此values-v11中的style.xml将是-

 <!-- 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并开始使用Android Design支持库中包含的AppBar布局


5
太好了,我错过了。不要忘记所有其他的-vXX文件夹,否则它在您的测试环境中会正常工作,只会在有人使用其中一个版本时咬您。
falstro 2014年

1
谢谢!刚刚将ActionBarActivity更改为Activity!:)
Inoy

66

要简单地添加ActionBar Compat,您的活动或应用程序应在AndroidManifest.xml中使用@ style / Theme.AppCompat主题,如下所示:

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

这将在活动中添加动作栏(或将所有主题添加到应用程序中的所有活动)


但是通常您需要自定义操作栏。为此,您需要使用Theme.AppCompat父级创建两个样式,例如“ @ style / Theme.AppCompat.Light”。第一个用于api 11> =(在android actionbar中构建版本的android版本),第二个用于api 7-10(在actionbar中不构建版本)。

让我们看看第一种样式。它将位于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样式项,我们应该使用支持库提供的样式项。与原始android一样,定义了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>

请注意,即使高于10的api级别已经具有操作栏,您仍应使用AppCompat样式。如果不这样做,则在装有android 3.0及更高版本的设备上启动Acitvity时会出现此错误:

java.lang.IllegalStateException:您需要在此活动中使用Theme.AppCompat主题(或后代)。

这是Chris Banes撰写的原始文章http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html的链接。

PS对不起我的英语


搞定了!UPVPTED
托尼·吉尔

20

检查并确保没有另一个引用theme.styled且不使用AppCompat主题的values文件夹

values-v11文件夹


这也是我的问题。我有一个库项目,必须导入appcompat-v7库并使所有主题扩展AppCompat主题。关键是,我的主项目在<application>中添加了tools:replace =“ android:icon,android:theme”选项,并且应该忽略其他项目中的样式。由于某些原因,该方法不起作用。
speedynomads 2015年

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应用。从更改ActionBarActivityActivityFragmentActivity,它将解决问题。



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 2013年

3

当我尝试在CustomAdapter类内执行某些操作时创建对话框时遇到此错误。 这不是Activity,而是Adapter类。 经过36小时的努力并寻找解决方案,我想到了这一点。

在调用CustomAdapter时将Activity作为参数发送。

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

即使活动确实使用Theme.AppCompat,我在三星设备上还是发生了此类崩溃。根本原因与三星方面的怪异优化有关:

- 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 2015年

2

在我的情况下,我创建了一个自定义视图,将其添加到自定义视图构造函数中

new RoomView(getAplicationContext());

正确的上下文是活动,因此将其更改为:

new RoomView(getActivity());

要么

new RoomView(this);

1

对于我的列表视图,我正在使用自定义适配器,它扩展了ArrayAdapter。在listiview我有2个按钮之一作为自定义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);

现在在Adapter类中的ur按钮内编写ur alertdialog

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

MainActivity(“主题=为解决我的问题,我将其添加到我的MainActivity(“ Theme =“ @ style / MyTheme”“”)中,其中MyTheme是主题的名称

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.