HCRM博客

WindowActionBar 报错应该如何解决?

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

一、问题分析

1、错误原因

WindowActionBar 报错应该如何解决?-图1
(图片来源网络,侵权删除)

主题设置不当:当前Activity的主题已经包含一个默认的ActionBar,而开发者试图通过代码或XML再添加一个Toolbar作为ActionBar,这导致了冲突。

父类影响:如果Activity继承自AppCompatActivity或其他带有默认ActionBar的父类,也可能导致这个问题。

2、解决方法

修改主题:在styles.xml中将WindowActionBar属性设置为false,以禁用默认的ActionBar。

继承正确的父类:确保Activity继承自AppCompatActivity(对于支持库)或Activity(对于原生API),而不是同时具有默认ActionBar的其他父类。

二、解决方法详解

1、修改主题

WindowActionBar 报错应该如何解决?-图2
(图片来源网络,侵权删除)

在res/values/styles.xml中为你的Activity定义一个新的主题,并将windowActionBarandroid: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

WindowActionBar 报错应该如何解决?-图3
(图片来源网络,侵权删除)
<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"/>
分享:
扫描分享到社交APP
上一篇
下一篇