在Android开发中,使用ActionBar时可能会遇到“This Activity already has an action bar supplied by the window decor”的报错,这个错误通常发生在尝试将一个Toolbar设置为ActionBar时,但当前的主题已经包含了一个默认的ActionBar,为了解决这个问题并更好地理解其原因,下面将详细解析该问题的可能原因、解决方法及示例代码。
一、问题分析
1、错误原因:

主题设置不当:当前Activity的主题已经包含一个默认的ActionBar,而开发者试图通过代码或XML再添加一个Toolbar作为ActionBar,这导致了冲突。
父类影响:如果Activity继承自AppCompatActivity
或其他带有默认ActionBar的父类,也可能导致这个问题。
2、解决方法:
修改主题:在styles.xml中将windowActionBar
属性设置为false
,以禁用默认的ActionBar。
继承正确的父类:确保Activity继承自AppCompatActivity
(对于支持库)或Activity
(对于原生API),而不是同时具有默认ActionBar的其他父类。
二、解决方法详解
1、修改主题:

在res/values/styles.xml中为你的Activity定义一个新的主题,并将windowActionBar
和android:windowNoTitle
属性设置为true
。
- <style name="AppTheme.NoActionBar">
- <item name="windowActionBar">false</item>
- <item name="android:windowNoTitle">true</item>
- </style>
然后在AndroidManifest.xml中为你的Activity应用这个主题:
- <activity android:name=".YourActivity"
- android:theme="@style/AppTheme.NoActionBar">
- </activity>
2、继承正确的父类:
确保你的Activity继承自正确的父类,对于使用支持库的项目,应继承自AppCompatActivity
;对于原生API项目,则继承自Activity
。
- public class YourActivity extends AppCompatActivity {
- // ...
- }
三、示例代码
以下是一个完整的示例,展示了如何在项目中修改主题并自定义ActionBar:
styles.xml:

- <resources>
- <!Base application theme >
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- <!Customize your theme here >
- </style>
- <!No ActionBar theme >
- <style name="AppTheme.NoActionBar">
- <item name="windowActionBar">false</item>
- <item name="android:windowNoTitle">true</item>
- </style>
- </resources>
AndroidManifest.xml:
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.myapp">
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:roundIcon="@mipmap/ic_launcher_round"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name=".MainActivity"
- android:theme="@style/AppTheme.NoActionBar">
- <intentfilter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intentfilter>
- </activity>
- </application>
- </manifest>
MainActivity.java:
- import android.os.Bundle;
- import androidx.appcompat.app.AppCompatActivity;
- import androidx.appcompat.widget.Toolbar;
- public class MainActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Toolbar toolbar = findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
- }
- }
activity_main.xml(布局文件):
- <?xml version="1.0" encoding="utf8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity">
- <androidx.appcompat.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
- android:background="?attr/colorPrimary"
- android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
- <!其他布局组件 >
- </RelativeLayout>
四、相关问答FAQs
Q1:为什么修改了主题后仍然报错?
A1:可能是因为你没有正确引用新定义的主题,或者在其他配置文件(如AndroidManifest.xml)中没有应用新的主题,请确保所有相关配置都已正确设置。
Q2:如何自定义Toolbar的样式?
A2:你可以通过在res/values/styles.xml中定义Toolbar的样式,并在布局文件中应用该样式来实现自定义。
- <style name="MyToolbarStyle" parent="Widget.AppCompat.Toolbar">
- <item name="android:background">@color/colorPrimary</item>
- <item name="titleTextAppearance">@style/MyTitleTextAppearance</item>
- </style>
然后在布局文件中引用该样式:
- <androidx.appcompat.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
- style="@style/MyToolbarStyle"/>