You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android模拟器运行正常但三星S21真机ActionBar报错求助

Android应用三星S21真机ActionBar崩溃问题解决

问题背景

使用Android Bumble Bee开发的应用在模拟器运行正常,但在三星S21真机启动时因ActionBar相关报错崩溃,已在主题中设置NoActionBar、windowNoTitle=true和windowActionBar=false。

报错日志

Process: com.example.wonderfinder, PID: 14427
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wonderfinder/com.example.wonderfinder.MainActivity}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4166)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4312)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2571)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:226)
        at android.os.Looper.loop(Looper.java:313)
        at android.app.ActivityThread.main(ActivityThread.java:8741)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
     Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
        at androidx.appcompat.app.AppCompatDelegateImpl.setSupportActionBar(AppCompatDelegateImpl.java:581)
        at androidx.appcompat.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:183)
        at com.example.wonderfinder.MainActivity.onCreate(MainActivity.java:46)
        at android.app.Activity.performCreate(Activity.java:8578)
        at android.app.Activity.performCreate(Activity.java:8557)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4147)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4312) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2571) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:226) 
        at android.os.Looper.loop(Looper.java:313) 
        at android.app.ActivityThread.main(ActivityThread.java:8741) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067) 
2022-11-16 13:17:46.765 14427-14427/? I/Process: Sending signal. PID: 14427 SIG: 9

theme.xml配置

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.WonderFinder" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="colorPrimary">@color/primaryColor</item>
        <item name="colorPrimaryVariant">@color/primaryDarkColor</item>
        <item name="android:colorPrimaryDark">@color/primaryColor</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/primaryColor</item>
        <item name="colorSecondaryVariant">@color/primaryColor</item>
        <item name="colorOnSecondary">@color/black</item>

        <item name="android:textColorHint">@color/textColor</item>

        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>

        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <item name="android:navigationBarColor">@color/primaryColor</item>
        <!-- Customize your theme here. -->
    </style>

    <style name="ActionBarTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">

        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>

        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/primaryColor</item>
        <item name="colorPrimaryVariant">@color/primaryDarkColor</item>
        <item name="android:colorPrimaryDark">@color/primaryColor</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/primaryColor</item>
        <item name="colorSecondaryVariant">@color/primaryColor</item>
        <item name="colorOnSecondary">@color/black</item>

        <item name="android:textColorHint">@color/textColor</item>

        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <item name="android:navigationBarColor">@color/primaryColor</item>
        <!-- Customize your theme here. -->
    </style>
</resources>

MainActivity代码

package com.example.wonderfinder;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.wonderfinder.databinding.ActivityMainBinding;
import com.example.wonderfinder.databinding.NavDrawerLayoutBinding;
import com.example.wonderfinder.databinding.ToolbarLayoutBinding;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import de.hdodenhof.circleimageview.CircleImageView;

public class MainActivity extends AppCompatActivity {

    //Declare all variables as private variables with their respective types
    private NavDrawerLayoutBinding navDrawerLayoutBinding;
    private ActivityMainBinding activityMainBinding;
    private ToolbarLayoutBinding toolbarLayoutBinding;
    private FirebaseAuth firebaseAuth;
    private TextView txtName, txtEmail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        navDrawerLayoutBinding = NavDrawerLayoutBinding.inflate(getLayoutInflater());
        setContentView(navDrawerLayoutBinding.getRoot());

        //Set the variables to their respective values
        activityMainBinding = navDrawerLayoutBinding.mainActivity;
        toolbarLayoutBinding = activityMainBinding.toolbar;
        setSupportActionBar(toolbarLayoutBinding.toolbar);
        firebaseAuth = FirebaseAuth.getInstance();

        //Toggle the drawer with open and close
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, navDrawerLayoutBinding.navDrawer, toolbarLayoutBinding.toolbar,
                R.string.open_navigation_drawer,
                R.string.close_navigation_drawer
        );

        navDrawerLayoutBinding.navDrawer.addDrawerListener(toggle);
        toggle.syncState();

        NavController navController = Navigation.findNavController(this, R.id.fragmentContainer);
        NavigationUI.setupWithNavController(navDrawerLayoutBinding.navigationView, navController);

        View headerLayout = navDrawerLayoutBinding.navigationView.getHeaderView(0);

        txtName = headerLayout.findViewById(R.id.txtHeaderName);
        txtEmail = headerLayout.findViewById(R.id.txtHeaderEmail);

        //Call getUserData method
        getUserData();

    }

    //Close the nav the drawer on back pressed
    @Override
    public void onBackPressed() {
        if (navDrawerLayoutBinding.navDrawer.isDrawerOpen(GravityCompat.START))
            navDrawerLayoutBinding.navDrawer.closeDrawer(GravityCompat.START);
        else
        super.onBackPressed();
    }

    //Method to populate the users username and email in the nav drawer
    private void getUserData() {
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users")
                .child(firebaseAuth.getUid());
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.exists()) {
                    UserModel userModel = snapshot.getValue(UserModel.class);
                    txtName.setText(userModel.getUsername());
                    txtEmail.setText(userModel.getEmail());
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }
}

解决方案

1. 确认Activity主题配置

检查AndroidManifest.xml中MainActivity的android:theme属性,确保它引用的是你配置的无ActionBar主题,而非系统默认带ActionBar的主题:

<activity
    android:name=".MainActivity"
    android:theme="@style/Theme.WonderFinder">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

2. 强制禁用系统ActionBar

在MainActivity的onCreate方法中,调用setContentView前添加代码,强制关闭系统默认ActionBar:

import android.view.Window;
import android.view.WindowManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // 强制禁用系统标题栏和ActionBar
    supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                         WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    super.onCreate(savedInstanceState);
    navDrawerLayoutBinding = NavDrawerLayoutBinding.inflate(getLayoutInflater());
    setContentView(navDrawerLayoutBinding.getRoot());
    
    // 后续原有代码...
}

3. 切换主题父类适配三星机型

三星部分机型对Material Components主题兼容性存在差异,尝试将主题父类切换为AppCompat无ActionBar主题,保留原有属性:

<style name="Theme.WonderFinder" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- 保留原有颜色、状态栏等属性 -->
    <item name="colorPrimary">@color/primaryColor</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <!-- 添加Material组件必要属性以保持样式一致性 -->
    <item name="materialButtonStyle">@style/Widget.MaterialComponents.Button</item>
    <!-- 其他原有属性... -->
</style>

4. 确保setSupportActionBar唯一调用

检查代码中仅调用一次setSupportActionBar(toolbarLayoutBinding.toolbar),且在主题禁用系统ActionBar之后执行,避免重复触发ActionBar冲突。


内容的提问来源于stack exchange,提问作者Luca Mouskides

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:50:29