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>

这是 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"。

4

13 回答 13

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 设计支持库中包含的 AppBar 布局

于 2013-09-18T11:21:17.500 回答
66

要简单地添加 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的链接。

于 2013-11-25T13:04:09.280 回答
20

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

values-v11文件夹

于 2013-09-08T23:11:47.597 回答
16

尝试这个...

样式.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>
于 2014-04-11T16:24:49.483 回答
11

Activity正在扩展ActionBarActivity,这需要AppCompat.theme应用。改成或,问题ActionBarActivity就解决了。ActivityFragmentActivity

于 2014-11-14T19:04:01.190 回答
4

只需执行构建-> 清理项目。我认为这将解决您的问题。

于 2016-04-23T07:07:10.607 回答
3

即使活动确实使用了 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"

于 2015-04-29T00:10:16.513 回答
3

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

当然可以。没有什么可以神奇地应用于Theme.Styled一项活动。您需要声明您的活动 - 或您的整个应用程序 - 正在使用Theme.Styled,例如:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Styled">
于 2013-08-05T18:08:28.300 回答
3

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

我希望这可以帮助你

于 2017-05-31T10:47:22.167 回答
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"
     >
于 2013-08-07T12:59:06.407 回答
2

就我而言,我制作了一个自定义视图,并添加到自定义视图构造函数中

new RoomView(getAplicationContext());

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

new RoomView(getActivity());

或者

new RoomView(this);
于 2016-07-27T08:12:49.320 回答
1

对于我的列表视图,我正在使用扩展 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);

现在在 Adapter 类中的按钮中写入你的 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();

            }
        });

于 2017-07-06T11:29:24.770 回答
-2

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")]
于 2017-01-27T11:36:21.693 回答