0

我嘗試在我的Xamarin.Forms應用的主頁上使用圖標而不是標題。Xamarin.Forms:如何將一個圖標分配給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

V7.Widget.Toolbar

  • 第二次,子參數是Xamarin.Forms.Platform.Android.PageContainer

PageContainer

所以,我想給孩子扔在Xamarin.Forms.Platform.Android。PageContainer,但我不能這樣做,因爲這個對象是「內部」:

PageContainer不可訪問,因爲它保護方法。

爲什麼我不能在代碼中使用QuickWatch? 我不明白是否有另一種方式來實現這一點... 你有什麼建議嗎?

回答

2

您應該重寫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" /> 
+0

你能分享你製作的自定義渲染嗎? @hankide請嘗試創建它,但它並未被解僱。 – acido

2

您可以通過短信中心做它,定義你想要做什麼。比方說您想在通首頁設置的圖標,其餘的刪除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"); 
     } 
+0

您的解決方案非常好,它很優雅。但是,由於Xamarin.Forms錯誤事件OnAppearing和OnDisappearing被解僱兩次,解決方案將無法正常工作。這裏有關於這個bug的更多信息:https://github.com/xamarin/Xamarin.Forms/issues/1438我會投票回答這個問題,因爲我覺得這是解決這個問題的最佳方案。 – acido

+0

如果可見性設置了兩次,我不會看到一個大問題,但是您可以添加布爾標誌來捕獲如果在出現解決該問題後消失的消息。 –

相關問題