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

C# Android应用:Navigation Drawer切换Activity后消失,需如MasterPage保留求助

解决C# Android中继承NavActivity后Navigation Drawer不显示的问题

你已经找对了复用Navigation Drawer的思路——通过继承基类Activity来实现类似ASP.NET MasterPage的效果,但在布局加载的环节出了点小问题,我们来一步步排查修复:

问题根源分析

你当前直接把portfolio_layout添加到drawerLayout的最上层(索引0),这会破坏DrawerLayout要求的标准结构(它需要至少两个子视图:主内容区 + 抽屉侧边栏),甚至可能让你的内容视图直接覆盖掉抽屉侧边栏,导致抽屉无法显示。另外,没有替换NavActivity中原有的主内容容器,而是直接新增视图,也会造成布局层级混乱。

修复步骤

1. 确保NavActivity的布局结构合规

首先,你的NavActivity布局(比如nav_activity_layout.axml)要遵循DrawerLayout的标准结构,包含一个用于加载动态内容的主容器和抽屉侧边栏:

<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 主内容容器,专门用来加载不同Activity的内容 -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- Navigation Drawer侧边栏 -->
    <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/nav_menu" />

</androidx.drawerlayout.widget.DrawerLayout>

2. 修改SecondActivity的布局加载逻辑

不要直接向drawerLayout添加视图,而是找到NavActivity中的主内容容器,将当前Activity的布局填充进去:

public class SecondActivity : NavActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        
        // 获取NavActivity中预留的主内容容器
        FrameLayout contentFrame = FindViewById<FrameLayout>(Resource.Id.content_frame);
        // 清空容器原有内容,避免叠加
        contentFrame.RemoveAllViews();
        // 将当前Activity的布局填充到容器中
        LayoutInflater.Inflate(Resource.Layout.portfolio_layout, contentFrame, true);

        Toast.MakeText(this, "Home selected!", ToastLength.Short).Show();
    }
}

3. 确保NavActivity的抽屉组件可被子类访问

在NavActivity中,把drawerLayout、navView这些核心组件的访问修饰符设为protected(而非private),让子类能正确继承并复用:

public class NavActivity : AppCompatActivity
{
    protected DrawerLayout drawerLayout;
    protected NavigationView navView;
    protected ActionBarDrawerToggle drawerToggle;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.nav_activity_layout);

        // 初始化抽屉组件
        drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawerLayout);
        navView = FindViewById<NavigationView>(Resource.Id.nav_view);
        drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, Resource.String.drawer_open, Resource.String.drawer_close);

        // 绑定抽屉菜单点击事件
        navView.NavigationItemSelected += NavView_NavigationItemSelected;

        // 把Toggle绑定到ActionBar
        drawerLayout.AddDrawerListener(drawerToggle);
        SupportActionBar.SetDisplayHomeAsUpEnabled(true);
        SupportActionBar.SetHomeButtonEnabled(true);
    }

    // 抽屉菜单跳转逻辑示例
    private void NavView_NavigationItemSelected(object sender, NavigationView.NavigationItemSelectedEventArgs e)
    {
        if (e.MenuItem.ItemId == Resource.Id.nav_second)
        {
            StartActivity(new Intent(this, typeof(SecondActivity)));
            drawerLayout.CloseDrawers();
        }
        // 其他菜单项逻辑...
    }

    // 同步Toggle状态,确保图标正常切换
    protected override void OnPostCreate(Bundle savedInstanceState)
    {
        base.OnPostCreate(savedInstanceState);
        drawerToggle.SyncState();
    }

    public override bool OnOptionsItemSelected(IMenuItem item)
    {
        if (drawerToggle.OnOptionsItemSelected(item))
        {
            return true;
        }
        return base.OnOptionsItemSelected(item);
    }
}

4. 额外检查点

  • 确保portfolio_layout的根布局宽高设置为match_parent,避免内容显示不全。
  • 检查NavActivity中是否有主题、权限相关的逻辑影响子类的抽屉显示。
  • 如果使用AndroidX组件,确保所有依赖库版本一致,避免兼容性问题。

这样修改后,SecondActivity就能正确继承NavActivity的Navigation Drawer,同时显示自己的内容视图,完全符合你想要的MasterPage复用效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:09:04