调用startActivity后App崩溃:RegisterActivity跳转MenuActivity问题排查
嘿,我看了你的问题和报错信息,马上就找到问题所在了!你开发的RegisterActivity注册成功后跳转MenuActivity时崩溃,核心原因已经在报错日志里写得很清楚了。
相关代码
MenuActivity.class
public class MenuActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private DrawerLayout drawer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); drawer = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); if(savedInstanceState == null) { getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MenuFragment()).commit(); navigationView.setCheckedItem(R.id.nav_profile); } } @Override public void onBackPressed() { if(drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch(item.getItemId()) { case R.id.nav_menu: getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MenuFragment()).commit(); break; case R.id.nav_profile: getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); break; case R.id.nav_send: getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SendFragment()).commit(); break; case R.id.nav_settings: getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit(); break; } drawer.closeDrawer(GravityCompat.START); return true; } }
RegisterActivity.class(注册跳转部分)
mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if(task.isSuccessful()) { Toast.makeText(RegisterActivity.this, "User successful created", Toast.LENGTH_SHORT).show(); startActivity(new Intent(getApplicationContext(), MenuActivity.class)); //Intent intent = new Intent(getApplicationContext(), MenuActivity.class); //intent.putExtra("fullName", fullName); //startActivity(intent); } else { Toast.makeText(RegisterActivity.this, "Error! " + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } });
报错信息
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.xxxxxxx, PID: 5790 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.xxxxxxx/com.example.xxxxxxx.activities.MenuActivity}: java.lang.IllegalStateException: 此Activity已有窗口装饰提供的ActionBar。若要使用Toolbar,请不要请求Window.FEATURE_SUPPORT_ACTION_BAR,并在主题中设置windowActionBar为false。 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) Caused by: java.lang.IllegalStateException: 此Activity已有窗口装饰提供的ActionBar。若要使用Toolbar,请不要请求Window.FEATURE_SUPPORT_ACTION_BAR,并在主题中设置windowActionBar为false。 at androidx.appcompat.app.AppCompatDelegateImpl.setSupportActionBar(AppCompatDelegateImpl.java:572) at androidx.appcompat.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:159) at com.example.inbioaiqua.activities.MenuActivity.onCreate(MenuActivity.java:30) at android.app.Activity.performCreate(Activity.java:6662) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
问题分析
报错日志里的关键提示已经点明了原因:
java.lang.IllegalStateException: 此Activity已有窗口装饰提供的ActionBar。若要使用Toolbar,请不要请求Window.FEATURE_SUPPORT_ACTION_BAR,并在主题中设置windowActionBar为false。
简单来说,你的MenuActivity同时拥有两个ActionBar:一个是系统主题默认提供的,另一个是你在代码里通过setSupportActionBar(toolbar)设置的自定义Toolbar,这就导致了冲突,直接触发崩溃。
修复方案
按照以下步骤操作就能解决问题:
创建/修改无ActionBar的主题
打开res/values/styles.xml(如果有夜间模式样式文件也要同步修改),添加或修改一个不含ActionBar的主题:<style name="AppTheme.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style>如果你用的是Material Components主题,也可以这样定义:
<style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 这里可以添加你需要的其他自定义属性,比如颜色、字体等 --> </style>为MenuActivity指定该主题
打开AndroidManifest.xml,找到MenuActivity的注册条目,添加android:theme属性指定刚才创建的主题:<activity android:name=".activities.MenuActivity" android:theme="@style/AppTheme.NoActionBar" />确认Toolbar布局正确
检查activity_menu.xml中的Toolbar配置,确保它是正常定义的,比如:<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" />
做完这些修改后,重新运行应用,注册成功跳转MenuActivity就不会崩溃了。
内容的提问来源于stack exchange,提问作者Francesco Bottiglia

