Xamarin.Forms:如何将一个图标分配给Android上的单个页面导航栏
我尝试在我的Xamarin.Forms应用的主页上使用图标而不是标题。Xamarin.Forms:如何将一个图标分配给Android上的单个页面导航栏
我已经读了很多相关的话题,但我没有找到任何解决办法:
- 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:
<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()因为我已经看到了快速监视,这种方法被称为每次我在Xamarin.Forms应用程序中导航。
我也注意到,该方法在导航过程中所谓的2倍:
- 第一次,孩子参数是V7.Widget.Toolbar:
- 第二次,子参数是Xamarin.Forms.Platform.Android.PageContainer:
所以,我想给孩子扔在Xamarin.Forms.Platform.Android。PageContainer,但我不能这样做,因为这个对象是“内部”:
PageContainer不可访问,因为它保护方法。
为什么我不能在代码中使用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" />
您可以通过短信中心做它,定义你想要做什么。比方说您想在通首页设置的图标,其余的删除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错误事件OnAppearing和OnDisappearing被解雇两次,解决方案将无法正常工作。这里有关于这个bug的更多信息:https://github.com/xamarin/Xamarin.Forms/issues/1438我会投票回答这个问题,因为我觉得这是解决这个问题的最佳方案。 – acido
如果可见性设置了两次,我不会看到一个大问题,但是您可以添加布尔标志来捕获如果在出现解决该问题后消失的消息。 –
你能分享你制作的自定义渲染吗? @hankide请尝试创建它,但它并未被解雇。 – acido