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