在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"/> 