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

Posted

技术标签:

【中文标题】ActionBarCompat: java.lang.IllegalStateException: 你需要使用 Theme.AppCompat【英文标题】:ActionBarCompat: java.lang.IllegalStateException: You need to use a Theme.AppCompat 【发布时间】:2013-08-06 11:15:22 【问题描述】:

我在 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 ComponentInfocom.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"。

【问题讨论】:

您的清单是否引用Theme.Styled 您是否有另一个引用 Theme.Styled 但不使用 AppCompat 主题的 values 文件夹? @tyczj 我添加了 res/values-v11/themes.xml 文件,它没有引用 Theme.Styled @tyczj 您可以使用您的评论作为答案,因为它可能是一个常见问题(我也是) You need to use a Theme.AppCompat theme (or descendant) with this activity的可能重复 【参考方案1】:

我的清单没有引用任何主题...它不应该是 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"(我第一次没有看到)。【参考方案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"
     >

【讨论】:

【参考方案3】:

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

values-v11文件夹

【讨论】:

这也是我的问题。我有一个库项目,必须导入 appcompat-v7 库并使所有主题扩展 AppCompat 主题。问题是,我的主项目在 中添加了 tools:replace="android:icon,android:theme" 选项,并且应该省略其他项目的样式。由于某种原因,它不起作用。【参考方案4】:

如果您在 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 Support Library 中包含的 AppBar 布局

【讨论】:

太好了,我错过了。不要忘记所有其他 -vXX 文件夹,否则它会在您的测试环境中正常工作,只是在有人使用其中一个版本时才会咬你。 谢谢!刚刚将 ActionBarActivity 更改为 Activity! :)【参考方案5】:

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

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

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


但通常您需要自定义操作栏。为此,您需要使用 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 样式项,我们应该使用支持库提供的一个。 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 的链接。

【讨论】:

【参考方案6】:

试试这个...

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>

【讨论】:

【参考方案7】:

您的Activity 正在扩展ActionBarActivity,这需要应用AppCompat.theme。 把ActionBarActivity改成Activity或者FragmentActivity就可以解决问题了。

【讨论】:

【参考方案8】:

我在 Samsung 设备上遇到了这样的崩溃,即使该活动确实使用了 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"

【讨论】:

你有这个来源吗?一段时间以来,我一直在寻找我的应用程序中的一个类似错误,这听起来很有希望。 这里也一样!很想知道更多关于这个!我也一直在我的应用程序中追踪一个类似的错误。不幸的是,我不使用android:launchMode="singleTask" 我观察到同样的问题。 Galaxy Tab A 10.1(Android 7.0,未植根和 SM-A320FL(Android 7.0,未植根)正在发生这种情况。我不使用android:launchMode="singleTask",我所有的活动都使用 AppCompat 主题:/【参考方案9】:

只需构建 -> 清理项目。我想这会解决你的问题。

【讨论】:

【参考方案10】:

就我而言,我制作了一个自定义视图 我添加到自定义视图 constructor

new RoomView(getAplicationContext());

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

new RoomView(getActivity());

new RoomView(this);

【讨论】:

【参考方案11】:

para resolver o meu problema, 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")]

【讨论】:

【参考方案12】:

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

希望对你有帮助

【讨论】:

【参考方案13】:

对于我的列表视图,我正在使用扩展 ArrayAdapter 的自定义适配器。 在 listiview 中,我有 2 个按钮,其中一个是自定义警报对话框框。 前任: 活动父活动; 适配器的构造函数 `

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

` 从 MainActivty 调用 Adapter

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();

            
        );

【讨论】:

以上是关于ActionBarCompat: java.lang.IllegalStateException: 你需要使用 Theme.AppCompat的主要内容,如果未能解决你的问题,请参考以下文章

Android Demo Android ActionBarCompat-ListPopupMenu

Could not extract response: no suitable HttpMessageConverter found for response type [class java.lan

Caused by: javax.el.PropertyNotFoundException: Property 'product' not found on type java.lan

spring3.2.0与mybatis3.2.7整合出错--Failed to read candidate component class--nested exception is java.lan

PreferenceActivity 中的 ActionBar

通过合并相似的列来操作重复的行[重复]