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
相关产品推荐
相关产品推荐

