2

J'ai fait un rendu pour faire un bouton rond dans Android. Il est exécuté sans problème lorsque vous entrez dans la page normalement. Mais lorsque vous appuyez sur le bouton Retour pour revenir à cette page, le bouton devient un carré.Xamarin android renderer: le bouton est rond la première fois, mais lorsqu'il est pressé sur le bouton de retour il devient carré

Mon code renderer:

public class FloatingActionButtonRenderer : Xamarin.Forms.Platform.Android.AppCompat.ButtonRenderer 
{ 
    private GradientDrawable _normal, _pressed; 

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) 
    { 
     base.OnElementChanged(e); 

     if (Control != null) 
     { 
      var button = (FloatingActionButton)e.NewElement; 

      button.SizeChanged += OnSizeChanged; 

     } 
    } 

    private void OnSizeChanged(object s, EventArgs e) { 
     var button = (FloatingActionButton)s; 
     var radius = (float)Math.Min(button.Width, button.Height) * Resources.DisplayMetrics.Density; 

     // Create a drawable for the button's normal state 
     _normal = new Android.Graphics.Drawables.GradientDrawable(); 

     if (button.BackgroundColor.R == -1.0 && button.BackgroundColor.G == -1.0 && button.BackgroundColor.B == -1.0) 
      _normal.SetColor(Android.Graphics.Color.ParseColor("#ff2c2e2f")); 
     else 
      _normal.SetColor(button.BackgroundColor.ToAndroid()); 

     _normal.SetCornerRadius(radius); 

     // Create a drawable for the button's pressed state 
     _pressed = new Android.Graphics.Drawables.GradientDrawable(); 
     var highlight = Context.ObtainStyledAttributes(new int[] { Android.Resource.Attribute.ColorActivatedHighlight }).GetColor(0, Android.Graphics.Color.Gray); 
     _pressed.SetColor(highlight); 
     _pressed.SetCornerRadius(radius); 

     // Add the drawables to a state list and assign the state list to the button 
     var sld = new StateListDrawable(); 
     sld.AddState(new int[] { Android.Resource.Attribute.StatePressed }, _pressed); 
     sld.AddState(new int[] { }, _normal); 
     Control.SetBackground(sld); 
     button.SizeChanged -= OnSizeChanged; 
    } 
} 

Je crée un gestionnaire pour la taille changé. Il est créé sans problème à chaque fois mais il n'entre dans l'événement que lorsque vous entrez dans la page normalement. Il n'entre pas lorsque vous appuyez sur le bouton de retour.

Captures d'écran du bouton d'action flottante: button

Modifier Quelques informations supplémentaires: j'ai oublié de mentionner que je passer outre la OnBackButtonPressed de mon MasterDetailPage, je l'ai fait parce que sinon il plantait quand je pressais sur le backbutton:

protected override bool OnBackButtonPressed() 
{ 

    Page page = GoPrevPage(); 
    if (page.GetType() == typeof(LoginPage)) 
    { 
     App.Current.MainPage = new LoginPage(); 
    } 

    else 
    { 
     page.Parent = null; 
     Detail = page; 

     navigationDrawerList.SelectedItem = selectedMenuItems.LastOrDefault(); 

    } 
    return true; 
} 

le GoPrevPage est une fonction à venir pour une classe statique:

public static class BackButtonHelper 
{ 
    public static List<Page> prevPages; 
    public static List<MasterPageItem> selectedMenuItems; 

    static BackButtonHelper() { 
     prevPages = new List<Page>(); 
     selectedMenuItems = new List<MasterPageItem>(); 
    } 

    public static Page GoPrevPage() { 
     prevPages.RemoveAt(prevPages.Count - 1); 
     selectedMenuItems.RemoveAt(selectedMenuItems.Count - 1); 
     return prevPages[prevPages.Count - 1]; 
    } 
    public static void AddPageToPrev(Page page, MasterPageItem masterPageItem) 
    { 

     if (!IsToegevoegd(page.ClassId)) 
     { 
      prevPages.Add(page); 
      selectedMenuItems.Add(masterPageItem); 
     } 


    } 
    private static bool IsToegevoegd(string title) { 

     return prevPages.Last().ClassId == title; 
    } 
} 

C'est l'action qui se produit lorsque vous cliquez sur le bouton d'action (la navigation:

private void insertTaak_Clicked(object sender, EventArgs e) 
{ 
    var navPage = new DetailTaak("0") { Title = "Taak toevoegen" }; 

    var app = Application.Current as App; 

    var mainPage = (MenuPage)app.MainPage; 


    mainPage.Detail = new NavigationPageBar(navPage); 
} 
+0

Essayez de trouver un autre événement comme 'OnAppeared' ou quelque chose d'égal qui est déclenché chaque fois que la vue est affichée. –

+0

Je ne trouve pas de gestionnaire d'événement pour un bouton similaire à celui qui apparaît. Impossible également de trouver une méthode à remplacer avec la même fonction que OnAppeared –

+0

"Il ne pas entrer lorsque vous appuyez sur le bouton de retour." Je ne peux pas reproduire ce problème, comment avez-vous utilisé ce 'FloatingActionButton'? Comment avez-vous navigué vers une autre page? –

Répondre

1

Je dis oublier l'événement de changement de taille et essayer la mise à jour directement

public class FloatingActionButtonRenderer : Xamarin.Forms.Platform.Android.AppCompat.ButtonRenderer 
{ 
    private GradientDrawable _normal, _pressed; 

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) 
    { 
     base.OnElementChanged(e); 

     if (Control != null) 
     { 
      var button = (FloatingActionButton)e.NewElement; 
      this.UpdateStyle(button); 
     } 
    } 

    protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == FloatingActionButton.HeightProperty.PropertyName || 
      e.PropertyName == FloatingActionButton.WidthProperty.PropertyName) 
     { 
      var button = (FloatingActionButton)sender; 
      UpdateStyle(button); 
     } 
     else 
     { 
      base.OnElementPropertyChanged(sender, e); 
     } 
    } 

    private void UpdateStyle(FloatingActionButton button) 
    { 
     try 
     { 
      var radius = (float)Math.Min(button.Width, button.Height) * Resources.DisplayMetrics.Density; 

      // Create a drawable for the button's normal state 
      _normal = new Android.Graphics.Drawables.GradientDrawable(); 

      if (button.BackgroundColor.R == -1.0 && button.BackgroundColor.G == -1.0 && button.BackgroundColor.B == -1.0) 
       _normal.SetColor(Android.Graphics.Color.ParseColor("#ff2c2e2f")); 
      else 
       _normal.SetColor(button.BackgroundColor.ToAndroid()); 

      _normal.SetCornerRadius(radius); 

      // Create a drawable for the button's pressed state 
      _pressed = new Android.Graphics.Drawables.GradientDrawable(); 
      var highlight = Context.ObtainStyledAttributes(new int[] { Android.Resource.Attribute.ColorActivatedHighlight }).GetColor(0, Android.Graphics.Color.Gray); 
      _pressed.SetColor(highlight); 
      _pressed.SetCornerRadius(radius); 

      // Add the drawables to a state list and assign the state list to the button 
      var sld = new StateListDrawable(); 
      sld.AddState(new int[] { Android.Resource.Attribute.StatePressed }, _pressed); 
      sld.AddState(new int[] { }, _normal); 
      Control.SetBackground(sld); 
     } 
     catch 
     { 
      //...No-op 
     } 
    } 
}