2017-11-16 3 views
1

탐색 페이지에서 뒤로 화살표 이미지를 변경하려고합니다. 이 안드로이드 애플 리케이션에서 내비게이션 페이지 렌더러를 만든 다음 toolbar.SetNavigationIcon 및 그 작동하지 않는 메서드를 사용하지만 toolbar.SetLogo를 사용할 때 잘 작동합니다.xamarin 양식에서 탐색 페이지 뒤로 버튼을 변경하는 방법

protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e) 
    { 

     base.OnElementChanged(e); 
     toolbar.SetNavigationIcon(Resource.Drawable.arrow); 
     toolbar.SetLogo(Resource.Drawable.arrow); 
    } 
    public override void OnViewAdded(Android.Views.View child) 
    { 
     base.OnViewAdded(child); 
     if (child.GetType() == typeof(Android.Support.V7.Widget.Toolbar)) 
     { 
      toolbar = (Android.Support.V7.Widget.Toolbar)child; 
      toolbar.ChildViewAdded += Toolbar_ChildViewAdded; 
     } 
    } 

또한 응용 프로그램에 이미지를 추가하려고 : navigationIcon을 toolbar.axml에, 나는 내 응용 프로그램을 시작할 때 그것은 디자이너 my arrow

하지만, 큰 표시 나는 같은 STANDART 화살표 아이콘 enter image description here

에게 있습니다 당신의 MainActivityFormsApplicationActivity입니다
+0

아니, 그것은 당신의'MainActivity' 유형은 무엇입니까 –

+0

도움이되지 않았다? –

답변

1

경우이 예를 참조 수 :

https://github.com/jessejiang0214/ChangeBackIconInXF/tree/master/Droid당신의 MainActivity 유형 FormsAppCompatActivity 경우

, 당신은 사용자 지정 PageRenderer와는 ToolbarNavigationIcon을 변경할 수 있습니다. 예를 들어

:

[assembly: ExportRenderer(typeof(ContentPage), typeof(NavigationPageRendererDroid))] 
... 
public class NavigationPageRendererDroid : PageRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Page> e) 
    { 
     base.OnElementChanged(e); 

     var context = (Activity)Xamarin.Forms.Forms.Context; 
     var toolbar = context.FindViewById<Android.Support.V7.Widget.Toolbar>(Droid.Resource.Id.toolbar); 

     toolbar.NavigationIcon = Android.Support.V4.Content.ContextCompat.GetDrawable(context, Resource.Drawable.Back); 
    } 
} 

사용법 :

MainPage = new NavigationPage(new MainPage()); 
... 
//When click a button in MainPage, navigate to another page 
private async void Button_Clicked(object sender, EventArgs e) 
{ 
    await Navigation.PushAsync(new TestPage()); 
} 

Effect.


업데이트 : 당신이 Navigation.PushAsync() 방법은 다른 페이지로 이동 사용하는 경우

, 시스템이 자동으로 source code에서 찾을 수는 Toolbar의 아이콘 업데이트됩니다

protected virtual Task<bool> OnPushAsync(Page view, bool animated) 
{ 
    return SwitchContentAsync(view, animated); 
} 

Task<bool> SwitchContentAsync(Page page, bool animated, bool removed = false, bool popToRoot = false) 
{ 
    ... 
    UpdateToolbar(); 
    ... 
} 

void UpdateToolbar() 
{ 
    ... 
    bool isNavigated = ((INavigationPageController)Element).StackDepth > 1; 
    if (isNavigated) 
    { 
     ... 
     if (NavigationPage.GetHasBackButton(Element.CurrentPage)) 
     { 
      //Set the navigation back icon < =================== !!! =-= 
      var icon = new DrawerArrowDrawable(activity.SupportActionBar.ThemedContext); 
      icon.Progress = 1; 
      bar.NavigationIcon = icon; 
     } 
    } 
    ... 
} 

솔루션 :

그래서 우리는 선택의 여지가 있지만 사용자 정의는 NavigationPageRenderer입니다. OnPushAsync 메서드를 사용하여 Toolbar 아이콘을 설정합니다.

using AToolbar = Android.Support.V7.Widget.Toolbar; 
[assembly: ExportRenderer(typeof(CustomNavigationPage), typeof(NavigationPageRendererDroid))] // APPCOMP 
... 
public class NavigationPageRendererDroid : Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer // APPCOMP 
{ 
    public AToolbar toolbar; 
    public Activity context; 

    protected override Task<bool> OnPushAsync(Page view, bool animated) 
    { 
     var retVal = base.OnPushAsync(view, animated); 

     context = (Activity)Xamarin.Forms.Forms.Context; 
     toolbar = context.FindViewById<Android.Support.V7.Widget.Toolbar>(Droid.Resource.Id.toolbar); 

     if (toolbar != null) 
     { 
      if (toolbar.NavigationIcon != null) 
      { 
       toolbar.NavigationIcon = Android.Support.V4.Content.ContextCompat.GetDrawable(context, Resource.Drawable.Back); 
       //toolbar.SetNavigationIcon(Resource.Drawable.Back); 
      } 
     } 
     return retVal; 
    } 
} 

CustomNavigationPagePCL에 정의되어 있습니다

public class CustomNavigationPage : NavigationPage 
{ 
    public CustomNavigationPage(Page startupPage) : base(startupPage) 
    { 
    } 
} 

는 사용법 : 내가 정적 도구 모음 속성을 추가하고 확인하고 내 MainActivity에서 :

public App() 
{ 
    InitializeComponent(); 

    MainPage = new CustomNavigationPage(new MainPage()); 
} 
... 
// In MainPage 
private async void Button_Clicked(object sender, EventArgs e) 
{ 
    await Navigation.PushAsync(new TestPage()); 
} 
+0

제 대답을 확인하십시오 –

+0

@ BogdanSevryukov, 제 답변을 업데이트했습니다. 완벽하게 작동합니다. 확인해보십시오. –

+0

@ BogdanSevryukov, 문제를 해결 했습니까? –

0

나는이에게 다음의 방법으로 해결 그것에서 OnCreateOptionsMenu

public static Toolbar ToolBar { get; private set; } 

    public override bool OnCreateOptionsMenu(IMenu menu) 
    { 
     ToolBar = FindViewById<Toolbar>(Resource.Id.toolbar); 
     ToolBar.SetNavigationIcon(Resource.Drawable.arrow); 
     return base.OnCreateOptionsMenu(menu); 
    } 

    protected override void OnCreate(Bundle bundle) 
    { 
     TabLayoutResource = Resource.Layout.Tabbar; 
     ToolbarResource = Resource.Layout.Toolbar; 
     .... 
    } 
PageRenderer에서 다음

:

protected override void OnElementChanged(ElementChangedEventArgs<Page> e) 
{ 
    base.OnElementChanged(e); 
    MainActivity.ToolBar?.SetNavigationIcon(Resource.Drawable.arrow); 
} 

그러나!이 방법에서 내가 나쁜 effect를 다시 그릴로가

사용법 :

async void tapImage_Tapped(object sender, EventArgs e) 
{ 
    await Navigation.PushAsync(new ChooseGenrePage(_listGenres)); 
} 
+0

이 재 작성 문제를 해결하기 위해 제 대답을 업데이트했습니다. 이것이 도움이 될 수 있기를 바랍니다. :) –

관련 문제