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

时间:2013-08-05 16:46:32

标签: android android-actionbar runtimeexception

我在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>

这是values-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”。

13 个答案:

答案 0 :(得分:96)

如果要在MainActivity中扩展ActionBarActivity,则还必须更改值-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 Support Library

中包含的AppBar布局

答案 1 :(得分:66)

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

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

这将在activty中添加actionbar(如果您将此主题添加到应用程序,则添加所有活动)


但通常您需要自定义操作栏。为此,您需要使用Theme.AppCompat父级创建两个样式,例如“@ style / Theme.AppCompat.Light”。第一个将用于api 11&gt; =(在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样式。如果不这样做,那么在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的链接。

P.S。对不起我的英文

答案 2 :(得分:20)

检查并确保您没有引用theme.styled且不使用AppCompat主题的其他值文件夹

values-v11文件夹

答案 3 :(得分: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>

答案 4 :(得分:11)

您的Activity正在延长ActionBarActivity,需要AppCompat.theme才能应用。 从ActionBarActivity更改为ActivityFragmentActivity,它将解决问题。

答案 5 :(得分:4)

Just do it Build - &gt;清洁项目。我认为这将解决您的问题。

答案 6 :(得分:3)

  

我的清单没有引用任何主题......它不应该是AFAIK

确实如此。没有什么能够将Theme.Styled神奇地应用于某项活动。您需要声明您的活动 - 或整个申请 - 使用Theme.Styled,例如:

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

答案 7 :(得分:3)

当我在CustomAdapter类中执行某些操作时尝试创建DialogBox时遇到此错误。 这不是一个Activity而是一个Adapter类。 经过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..

我希望这有助于你

答案 8 :(得分: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"
     >

答案 9 :(得分: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"

答案 10 :(得分:2)

在我的情况下,我做了一个自定义视图 我添加到自定义视图构造函数

new RoomView(getAplicationContext());

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

new RoomView(getActivity());

new RoomView(this);

答案 11 :(得分: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调用适配器

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

现在在适配器类

中的ur按钮内写下你的alertdialog

&#13;
&#13;
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();

            }
        });
&#13;
&#13;
&#13;

答案 12 :(得分:-2)

para resolver o meu problema,eu apenas adicionei na minha MainActivity(&#34; Theme =解决我的问题,我只是在我的MainActivity中添加它(&#34; Theme =&#34; @ style / MyTheme& #34;&#34;)其中MyTheme是我主题的名称

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]