c# - Xamarin Android 菜单项不动态显示
问题描述
我正在使用 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();
};
}