簡體   English   中英

Xamarin Android 菜單項不動態顯示

[英]Xamarin Android Menu item not show dynamically

我正在使用 Xamarin Android 開發我的應用程序,但我遇到了菜單項問題。 Android 庫的更新出現了問題 - 所有舊版支持現在都在 AndroidX 庫中,所以我將整個項目遷移到它並發生了以下情況。

關閉我的應用程序的用戶應該能夠登錄。 登錄和注冊按鈕后隱藏和注銷按鈕顯示。 這很好用,但我發現這只是因為彈出登錄/注冊對話框,它以某種方式強制菜單在對話框關閉時重繪。 問題是當用戶注銷時,分別應該登錄和注冊按鈕顯示和注銷按鈕隱藏,但只有注銷隱藏,其他按鈕不顯示。 只有在單擊菜單中的某些內容后,它才會重繪自身並顯示按鈕。

這一切都顯示在屏幕截圖上。

菜單外觀

登錄彈出對話框

登錄后

注銷后 - 未顯示按鈕

我是如何操作按鈕的:

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;
    }

對於您提供的代碼,我認為它是由 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();
        };
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM