![](/img/trans.png)
[英]Is it possible to change the tabbar selected item color dynamically in Xamarin Forms 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.