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

Android Navigation Drawer项点击仅关抽屉,无法跳转至目标Activity求助

问题描述

开发Android应用时,点击Navigation Drawer中的菜单项(如X/Twitter),抽屉仅自动关闭,无法跳转到指定的DemoActivity。

代码片段

MainActivity.java

/* MainActivity.java */

NavigationView navigationView = findViewById(R.id.navigationview);
Menu menu = navigationView.getMenu();

// Set a click listener for the Twitter menu item
MenuItem twitterMenuItem = menu.findItem(R.id.twitter_menu);
twitterMenuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        // Handle Twitter menu item click
        startActivity(new Intent(MainActivity.this, DemoActivity.class));
        return true;
    }
});


navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        // Handle navigation view item clicks here
        int id = item.getItemId();

        if (id == R.id.twitter_menu) {
            // Handle Twitter menu item click
            startActivity(new Intent(MainActivity.this, DemoActivity.class));
            // Return true to indicate that the item is handled
            return true;
        }


        drawerLayout.closeDrawer(GravityCompat.START);

        // Return false to indicate that the item is not handled
        return false;
    }
});

sidemenu.xml

/*sidemenu.xml*/

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="Rewards">
        <menu>
            <item
                android:id="@+id/share_menu"
                android:title="Earn Rewards"
                android:icon="@drawable/share_vector" />

            <item
                android:id="@+id/refer_menu"
                android:title="Redeem your Points"
                android:icon="@drawable/refer_vector" />
        </menu>
    </item>

    <group android:id="@+id/social_group">
        <item
            android:title="Follow Us on Social Media">
            <menu>
                <item
                    android:id="@+id/youtube_menu"
                    android:title="Linkedin"
                    android:icon="@drawable/youtube_color_svgrepo_com" />

                <item
                    android:id="@+id/twitter_menu"
                    android:title="X"
                    android:icon="@drawable/xlog"/>

                <item
                    android:id="@+id/facebook_menu"
                    android:title="Facebook"
                    android:icon="@drawable/facebook_color_svgrepo_com" />

                <item
                    android:id="@+id/whatsapp_menu"
                    android:title="WhatsApp"
                    android:icon="@drawable/whatsapp_svgrepo_com" />

            </menu>
        </item>
    </group>
</menu>

activity_main.xml

/* activity_main.xml */

<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawerlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity"
    tools:openDrawer="start">

    <!--Sidemenu-->
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationview"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/headerfile"
        app:menu="@menu/sidemenu" />
    <!--My ScrollView Con-->

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">


            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:background="@drawable/gradient"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:title="CAMPUS"
                app:titleMarginStart="40dp"
                app:titleTextAppearance="@style/ToolbarTitleText">

                <ImageView
                    android:id="@+id/bell_icon"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="end"
                    android:layout_marginEnd="16dp"
                    android:contentDescription="Bell Icon"
                    android:src="@drawable/wallet" />

            </androidx.appcompat.widget.Toolbar>
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.core.widget.NestedScrollView>
</androidx.drawerlayout.widget.DrawerLayout>

问题根源

  1. DrawerLayout布局顺序错误:主内容区域(NestedScrollView)必须是DrawerLayout的第一个子元素,侧边栏(NavigationView)为第二个。当前顺序颠倒,可能导致点击事件传递异常。
  2. 重复设置点击监听:同时给子菜单项单独设置setOnMenuItemClickListener和给NavigationView设置setNavigationItemSelectedListener,引发事件冲突。
  3. DrawerLayout未初始化:代码中未通过findViewById获取DrawerLayout实例,影响逻辑完整性。
  4. DemoActivity可能未注册:若DemoActivity未在AndroidManifest.xml中声明,跳转将静默失败。

解决方案

1. 修正DrawerLayout布局顺序

将主内容区域移至第一个位置,侧边栏放在第二个:

/* 修正后的activity_main.xml */
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawerlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity"
    tools:openDrawer="start">

    <!-- 主内容区域:必须为DrawerLayout第一个子元素 -->
    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:background="@drawable/gradient"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:title="CAMPUS"
                app:titleMarginStart="40dp"
                app:titleTextAppearance="@style/ToolbarTitleText">

                <ImageView
                    android:id="@+id/bell_icon"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="end"
                    android:layout_marginEnd="16dp"
                    android:contentDescription="Bell Icon"
                    android:src="@drawable/wallet" />

            </androidx.appcompat.widget.Toolbar>
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.core.widget.NestedScrollView>

    <!-- 侧边栏:作为DrawerLayout第二个子元素 -->
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationview"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/headerfile"
        app:menu="@menu/sidemenu" />
</androidx.drawerlayout.widget.DrawerLayout>

2. 简化点击监听逻辑

移除重复的子菜单项监听,统一使用NavigationView的全局监听,并初始化DrawerLayout:

/* 修正后的MainActivity.java */
DrawerLayout drawerLayout = findViewById(R.id.drawerlayout);
NavigationView navigationView = findViewById(R.id.navigationview);

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();

        // 处理X/Twitter菜单项跳转
        if (id == R.id.twitter_menu) {
            startActivity(new Intent(MainActivity.this, DemoActivity.class));
        }
        // 可添加其他菜单项的处理逻辑
        else if (id == R.id.youtube_menu) {
            // 处理LinkedIn跳转
        }
        else if (id == R.id.facebook_menu) {
            // 处理Facebook跳转
        }

        // 统一关闭抽屉
        drawerLayout.closeDrawer(GravityCompat.START);
        // 返回true表示事件已处理
        return true;
    }
});

3. 检查DemoActivity注册

确保AndroidManifest.xml中已声明DemoActivity:

<activity android:name=".DemoActivity" />

验证步骤

  1. 重新编译运行应用
  2. 打开Navigation Drawer,点击X/Twitter菜单项
  3. 确认抽屉关闭后,DemoActivity正常启动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:57:07