Xamarin.Forms:如何将导航栏图标分配给 Android 上的单个页面
Xamarin.Forms: how to assign an icon to the Navigation Bar to a single page on Android
我尝试在 Xamarin.Forms 应用程序的主页上使用图标而不是标题。
我已经阅读了很多相关主题,但我没有找到任何解决方案:
- navigationpage-settitleicon
- navigationpage-settitleicon-works-on-ios-but-not-android
- toolbar-title-set-center-align
- xamarin-forms-custom-toolbar-android
- navigationpage-settitleicon-works-on-ios-but-not-android
在 iOS 上,只需在我的第一页上添加即可轻松完成此操作:
NavigationPage.SetTitleIcon(this, "navbar_logo.png");
在 Android,我在 Toolbar.axml[= 添加了这个76=]:
<ImageView android:src="@drawable/navbar_adp_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
这有效,但图标现在在 Android...
的每个页面上都可见
我曾尝试使用 渲染器 在导航到另一个页面时隐藏图标。为此,我想使用覆盖 OnViewAdded() 方法:
public class CustomNavigationPageRenderer : NavigationPageRenderer
{
public override void OnViewAdded(Android.Views.View child)
{ ... }
}
我尝试使用 OnViewAdded() 因为我在 QuickWatch 中看到每次我在 Xamarin.Forms 应用程序中导航时都会调用此方法。
我还注意到该方法在导航过程中被调用了 2 次:
- 第一次,child参数是一个V7.Widget.Toolbar:
- 第二次,child参数是一个Xamarin.Forms.Platform.Android.PageContainer:
所以我尝试将 child 转换为 Xamarin.Forms.Platform.Android.PageContainer,但我做不到,因为这个 object 是 "internal":
PageContainer is inaccessible due to its protection method.
如果我可以用 QuickWatch 来做,为什么我不能用代码来做?
我不知道是否有另一种方法可以实现这一目标......
你有什么建议吗?
您应该覆盖 OnElementChanged
方法并查找对 CurrentPage
属性 的更改。这样您将始终知道特定页面何时显示,并且可以隐藏或显示工具栏图标。
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName.Equals("CurrentPage"))
// If we're on MainPage show the icon, otherwise hide it
ChangeToolbarIconVisibility(Element.CurrentPage is MainPage);
}
private void ChangeToolbarIconVisibility(bool visible)
{
var toolbarIcon = FindViewById<ImageView>(Resource.Id.toolbarIcon);
toolbarIcon.Visibility = visible ? Android.Views.ViewStates.Visible : Android.Views.ViewStates.Gone;
}
要完成这项工作,请记住将 id 添加到修改后的工具栏布局中:
<ImageView android:src="@drawable/navbar_adp_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/toolbarIcon" />
您可以使用消息中心来完成,并定义您想要做什么。假设你想在你的 MainPage 上设置一个图标,其余的要删除 it.You 可以使用类似的东西:
在非主页上:
MessagingCenter.Send<Page, string>(this, "toolbar", "notmain");
在主页上:
MessagingCenter.Send<Page, string>(this, "toolbar", "main");
您在 MainActivity 中订阅了这些消息,如下所示。
var toolbarIcon = FindViewById<ImageView>(Resource.Id.navbar_adp_logo);
//recommendation: do not use lambda, define a delegate function
MessagingCenter.Subscribe<Page, string>(this, "toolbar", (page, toolbar) =>
{
if (toolbar == "main")
{
toolbarIcon.Visibility = ViewStates.Visible;
}
else
{
toolbarIcon.Visibility = ViewStates.Gone;
}
});
别忘了在xaml
中定义
android:id="@+id/navbar_adp_logo"
如果您只想在一个页面上发送消息,那么您可以在所需页面上执行一次以下操作,而不是从每个页面发送消息
protected override void OnDisappearing()
{
base.OnDisappearing();
MessagingCenter.Send<Page, string>(this, "toolbar", "notmain");
}
protected override void OnAppearing()
{
base.OnAppearing();
MessagingCenter.Send<Page, string>(this, "toolbar", "main");
}
我尝试在 Xamarin.Forms 应用程序的主页上使用图标而不是标题。
我已经阅读了很多相关主题,但我没有找到任何解决方案:
- navigationpage-settitleicon
- navigationpage-settitleicon-works-on-ios-but-not-android
- toolbar-title-set-center-align
- xamarin-forms-custom-toolbar-android
- navigationpage-settitleicon-works-on-ios-but-not-android
在 iOS 上,只需在我的第一页上添加即可轻松完成此操作:
NavigationPage.SetTitleIcon(this, "navbar_logo.png");
在 Android,我在 Toolbar.axml[= 添加了这个76=]:
<ImageView android:src="@drawable/navbar_adp_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
这有效,但图标现在在 Android...
的每个页面上都可见我曾尝试使用 渲染器 在导航到另一个页面时隐藏图标。为此,我想使用覆盖 OnViewAdded() 方法:
public class CustomNavigationPageRenderer : NavigationPageRenderer
{
public override void OnViewAdded(Android.Views.View child)
{ ... }
}
我尝试使用 OnViewAdded() 因为我在 QuickWatch 中看到每次我在 Xamarin.Forms 应用程序中导航时都会调用此方法。
我还注意到该方法在导航过程中被调用了 2 次:
- 第一次,child参数是一个V7.Widget.Toolbar:
- 第二次,child参数是一个Xamarin.Forms.Platform.Android.PageContainer:
所以我尝试将 child 转换为 Xamarin.Forms.Platform.Android.PageContainer,但我做不到,因为这个 object 是 "internal":
PageContainer is inaccessible due to its protection method.
如果我可以用 QuickWatch 来做,为什么我不能用代码来做? 我不知道是否有另一种方法可以实现这一目标...... 你有什么建议吗?
您应该覆盖 OnElementChanged
方法并查找对 CurrentPage
属性 的更改。这样您将始终知道特定页面何时显示,并且可以隐藏或显示工具栏图标。
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName.Equals("CurrentPage"))
// If we're on MainPage show the icon, otherwise hide it
ChangeToolbarIconVisibility(Element.CurrentPage is MainPage);
}
private void ChangeToolbarIconVisibility(bool visible)
{
var toolbarIcon = FindViewById<ImageView>(Resource.Id.toolbarIcon);
toolbarIcon.Visibility = visible ? Android.Views.ViewStates.Visible : Android.Views.ViewStates.Gone;
}
要完成这项工作,请记住将 id 添加到修改后的工具栏布局中:
<ImageView android:src="@drawable/navbar_adp_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/toolbarIcon" />
您可以使用消息中心来完成,并定义您想要做什么。假设你想在你的 MainPage 上设置一个图标,其余的要删除 it.You 可以使用类似的东西:
在非主页上:
MessagingCenter.Send<Page, string>(this, "toolbar", "notmain");
在主页上:
MessagingCenter.Send<Page, string>(this, "toolbar", "main");
您在 MainActivity 中订阅了这些消息,如下所示。
var toolbarIcon = FindViewById<ImageView>(Resource.Id.navbar_adp_logo);
//recommendation: do not use lambda, define a delegate function
MessagingCenter.Subscribe<Page, string>(this, "toolbar", (page, toolbar) =>
{
if (toolbar == "main")
{
toolbarIcon.Visibility = ViewStates.Visible;
}
else
{
toolbarIcon.Visibility = ViewStates.Gone;
}
});
别忘了在xaml
中定义 android:id="@+id/navbar_adp_logo"
如果您只想在一个页面上发送消息,那么您可以在所需页面上执行一次以下操作,而不是从每个页面发送消息
protected override void OnDisappearing()
{
base.OnDisappearing();
MessagingCenter.Send<Page, string>(this, "toolbar", "notmain");
}
protected override void OnAppearing()
{
base.OnAppearing();
MessagingCenter.Send<Page, string>(this, "toolbar", "main");
}