【问题标题】:Xamarin Android Menu item not show dynamicallyXamarin Android 菜单项不动态显示
【发布时间】:2021-05-26 13:35:46
【问题描述】:

我正在使用 Xamarin Android 开发我的应用程序,但我遇到了菜单项问题。 更新 Android 库时出现问题 - 所有旧版支持现在都在 AndroidX 库中,因此我将整个项目迁移到它并发生了以下情况。

关闭我的应用程序的用户应该能够登录。登录和注册按钮后隐藏和注销按钮显示。这很好,但我发现这只是因为弹出登录/注册对话框,它以某种方式强制菜单在对话框关闭时重绘。问题是当用户注销时,分别应该登录和注册按钮显示和注销按钮隐藏,但只有注销隐藏,其他按钮不显示。只有在单击菜单中的某些内容后,它才会重绘自身并显示按钮。

全部显示在屏幕截图中。

Menu how it looks

login popup dialog

after login

after logout - buttons not shown

我是如何操作按钮的:

private void SetupGuiAfterSignIn()
    {
        if (!User.IsSignIn())
            return;

        var navheadr = navigationView.GetHeaderView(0).FindViewById<LinearLayout>(Resource.Id.navheader);
        navheadr.Visibility = ViewStates.Visible;

        var navheaderUsername = navigationView.GetHeaderView(0).FindViewById<TextView>(Resource.Id.navheader_username);
        navheaderUsername.Text = User.GetEmail();

        navigationView.Menu.FindItem(Resource.Id.nav_login).SetVisible(false);
        navigationView.Menu.FindItem(Resource.Id.nav_register).SetVisible(false);
        navigationView.Menu.FindItem(Resource.Id.nav_logout).SetVisible(true);

        navigationView.Menu.FindItem(Resource.Id.nav_find_users).SetVisible(true);

        InvalidateOptionsMenu();

    }

private void SetupGuiAfterLogout()
    {
        if (User.IsSignIn())
            return;

        var navheadr = navigationView.GetHeaderView(0).FindViewById<LinearLayout>(Resource.Id.navheader);
        navheadr.Visibility = ViewStates.Gone;

        navigationView.Menu.FindItem(Resource.Id.nav_login).SetVisible(true);
        navigationView.Menu.FindItem(Resource.Id.nav_register).SetVisible(true);
        navigationView.Menu.FindItem(Resource.Id.nav_logout).SetVisible(false);

        navigationView.Menu.FindItem(Resource.Id.nav_find_users).SetVisible(false);


        InvalidateOptionsMenu();

    }

我也有 OnCreateOptionsMenu:

public override bool OnCreateOptionsMenu(IMenu menu)
    {
        navigationView.InflateMenu(Resource.Menu.menu); //Navigation Drawer Layout Menu Creation  
        navigationView.InflateHeaderView(Resource.Menu.NavMenuHeader);
        base.OnCreateOptionsMenu(menu);
        return true;
    }

【问题讨论】:

    标签: c# android xamarin xamarin.android


    【解决方案1】:

    对于您提供的代码,我认为它是由 Login、Register、LoginOut 引起的,没有像下面那样设置在同一组中。

        <menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
    android:id="@+id/nav_home"
    android:title="Home" />
        <item
    android:id="@+id/nav_findusers"
    android:visible="false"
    android:title="FindUsers" />
        <item
    android:id="@+id/nav_import"
    android:title="Import" />
        <item
    android:id="@+id/nav_FAQ"
    android:title="FAQ" />
        <item
    android:id="@+id/nav_report"
    android:title="ReportBug" />
         
    </group>
    <item>
        <menu>
            <item
    android:id="@+id/nav_Login"
    android:title="Login" />
            <item
    android:id="@+id/nav_register"
    android:title="Register" />
            <item  android:visible="false"
    android:id="@+id/nav_LoginOut" 
    android:title="LoginOut" />
    
        </menu>
    </item>
    </menu>
    

    更新:

    您可以使用两个组并设置 id 来显示分界线。

    <?xml version="1.0" encoding="utf-8" ?>
    <menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
    android:id="@+id/nav_home"
    android:title="Home" />
        <item android:visible="false"
    android:id="@+id/nav_findusers"
    android:title="FindUsers" />
        <item
      android:id="@+id/nav_import"
    android:title="Import" />
        <item
    android:id="@+id/nav_FAQ"
    android:title="FAQ" />
        <item
    android:id="@+id/nav_report"
    android:title="ReportBug" />
    
    </group>
    <group android:id="@+id/tt" android:checkableBehavior="single">
        <item
    android:id="@+id/nav_Login"
    android:title="Login" />
        <item
    android:id="@+id/nav_register"
    android:title="Register" />
        <item  android:visible="false"
    android:id="@+id/nav_LoginOut"
    android:title="LoginOut" />
    </group>
    </menu>
    

    菜单外观:

    登录后:

    注销后:

    项目点击时的代码:

      void setupDrawerContent(NavigationView navigationView)
        {
            navigationView.NavigationItemSelected += (sender, e) =>
            {
    
                switch (e.MenuItem.ItemId)
                {
                    case Resource.Id.nav_home:
                        {
                            //drawerLayout.OpenDrawer(Resource.Layout.Home);
                            //var home = new Intent(this, typeof(Activity_Home));
                            //StartActivity(home);
                            //navigationView.Menu.FindItem(Resource.Id.nav_LoginOut).SetVisible(true);
                            break;
                        }
    
                    case Resource.Id.nav_Login:
                        {
                            navigationView.Menu.FindItem(Resource.Id.nav_LoginOut).SetVisible(true);
                            navigationView.Menu.FindItem(Resource.Id.nav_findusers).SetVisible(true);
                            navigationView.Menu.FindItem(Resource.Id.nav_Login).SetVisible(false);
                            navigationView.Menu.FindItem(Resource.Id.nav_register).SetVisible(false);
    
                            
                            break;
                        }
    
                    case Resource.Id.nav_LoginOut:
                        {
                            navigationView.Menu.FindItem(Resource.Id.nav_Login).SetVisible(true);
                            navigationView.Menu.FindItem(Resource.Id.nav_register).SetVisible(true);
                            navigationView.Menu.FindItem(Resource.Id.nav_LoginOut).SetVisible(false);
    
                            navigationView.Menu.FindItem(Resource.Id.nav_findusers).SetVisible(false);
                            break;
                        }
    
                    default:
                        break;
    
                        //TODO check the ID and start your activity or switch the fragments
                }
    
                //e.MenuItem.SetChecked(true);
                //drawerLayout.CloseDrawers();
            };
        }
    

    【讨论】:

    • 嘿伙计,非常感谢您的快速响应,它确实有效,但仍然是一种解决方法。你知道为什么会发生这种情况,或者它是否已被弃用或类似的东西? ...这让我很好奇,因为它发生在迁移到较新的 android 库之后。
    • 我猜这个布局在使用嵌套菜单时不能正确更新。您可以改用解决方法。
    • 是的,我知道了,但是应该有一个正确的解释为什么它不起作用。我很欣赏这个解决方案,因为我坚持了一段时间,但这让它看起来有点不同。所以我想以“正确”的方式解决它,让它按照设计的方式工作。您是否有一些文档链接,例如描述的地方?
    • 我需要更多时间来确认,并会尽快反馈。
    • @renegato 我使用两个组并设置 id 以显示 ividing 线。请检查我的更新。
    猜你喜欢
    • 2014-02-08
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多