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

Android应用抽屉菜单Exit选项无法退出应用问题求助

问题描述

开发Android应用时,抽屉菜单中的"Exit"选项点击后无任何反应,应用无法关闭。添加的Log语句仅触发了WelcomeActivity的onCreate方法日志,菜单相关日志均无输出,应用运行无报错。

相关代码

WelcomeActivity代码

package com.enetapplications.songtracker;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

public class WelcomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        Log.d("WelcomeActivity", "WA: onCreate method (line 23)");
        Log.d("ActivityTracker", "WelcomeActivity is created");

        // Get references to the TextViews
        TextView welcomeText = findViewById(R.id.welcomeText);
        TextView userNameText = findViewById(R.id.userNameText);
        TextView userEmailText = findViewById(R.id.userEmailText);
        TextView userIdText = findViewById(R.id.userIdText);

        // Retrieve user data from intent extras
        Intent intent = getIntent();
        String userName = intent.getStringExtra("USER_NAME");
        String userEmail = intent.getStringExtra("USER_EMAIL");
        int userId = intent.getIntExtra("USER_ID", -1); // Use "USER_ID" as the key name

        // Set the values in TextViews
        welcomeText.setText("Welcome " + userName);
        userNameText.setText("User Name: " + userName);
        userEmailText.setText("Email: " + userEmail);
        userIdText.setText("User ID: " + userId);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.drawer_menu, menu);
        Log.d("WelcomeActivity", "WA: Menu created (line 47)");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        Log.d("WelcomeActivity", "WA: just entering onOptionsItemSelected (line 52)");
        switch (item.getItemId()) {
            // Handle other menu items if any

            case R.id.menu_item_exit:
                // Add code here to perform logout or cleanup tasks if needed
                Log.d("WelcomeActivity", "WA: Exit menu item clicked");
                finish(); // This will close the app
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

drawer_menu.xml相关代码

<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">


    <!-- Header: About -->
    <item
        android:id="@+id/menu_item_about_header"
        android:title="About"
        android:enabled="false" />

    <!-- About Menu Group -->
    <group android:id="@+id/group_about">
        <item
            android:id="@+id/menu_item_app_information"
            android:title="App Information" />
        <item
            android:id="@+id/menu_item_credits"
            android:title="Credits" />
        <item
            android:id="@+id/menu_item_exit"
            android:title="Exit" />
    </group>
</menu>

问题原因及解决方法

核心问题

你当前使用的onCreateOptionsMenu和onOptionsItemSelected是用于ActionBar选项菜单的回调,而非抽屉菜单(NavigationDrawer)的事件处理逻辑,所以菜单的点击事件根本没有被监听,自然不会触发相关日志和退出逻辑。

解决步骤

  1. 确认布局文件中的NavigationView配置
    检查activity_welcome.xml,确保包含NavigationView组件,并且通过app:menu关联了drawer_menu.xml,示例布局片段:

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/drawer_menu" />
    
  2. 在WelcomeActivity中设置抽屉菜单的点击监听器
    修改onCreate方法,添加NavigationView的实例获取和事件监听逻辑:

    import com.google.android.material.navigation.NavigationView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        // ... 原有代码保持不变 ...
    
        // 获取NavigationView实例
        NavigationView navView = findViewById(R.id.nav_view);
        // 设置抽屉菜单点击监听器
        navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Log.d("WelcomeActivity", "WA: 抽屉菜单项被点击");
                switch (item.getItemId()) {
                    case R.id.menu_item_app_information:
                        // 处理应用信息跳转逻辑
                        return true;
                    case R.id.menu_item_credits:
                        // 处理 credits 逻辑
                        return true;
                    case R.id.menu_item_exit:
                        Log.d("WelcomeActivity", "WA: Exit菜单项被点击");
                        // 退出应用:如果是单一Activity,finish()即可;如果有多个Activity,用finishAffinity()关闭所有栈内Activity
                        finishAffinity();
                        // 可选:彻底终止应用进程(谨慎使用)
                        // System.exit(0);
                        return true;
                    default:
                        return false;
                }
            }
        });
    }
    
  3. 移除无用的选项菜单回调
    因为你不需要ActionBar选项菜单,可以删除onCreateOptionsMenu和onOptionsItemSelected这两个方法,避免混淆。

补充说明

  • finish()只会关闭当前Activity,如果应用栈中还有其他Activity,应用不会完全退出;finishAffinity()会关闭当前任务栈中的所有Activity,适合需要完全退出应用的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:32:34