Botón de acción flotante en Xamarin.Forms

Había completado la página de inicio de mi aplicación en Xamarin.Forms Portable.

Ahora quiero agregar un botón de acción de flotación en mi proyecto de Android!

¿Hay alguna manera de agregar FAB para Android en mi página de inicio existente, que fue codificado en Xamarin.Forms Portable.

O

Quiero crear una página de inicio independiente para Android y añadirlo como una página principal para Android?

Gracias y saludos.

Antes de que saliera la biblioteca de apoyo oficial, volví a portar la FAB.

Ahora hay un ejemplo de Xamarin.Forms en mi repo de GitHub que puedes usar: https://github.com/jamesmontemagno/FloatingActionButton-for-Xamarin.Android

Creación de un control personalizado Para que las propiedades de FAB sean vinculables en Xamarin.Forms, necesitamos un control personalizado con propiedades vinculables.

 public class FloatingActionButtonView : View { public static readonly BindableProperty ImageNameProperty = BindableProperty.Create<FloatingActionButtonView,string>( p => p.ImageName, string.Empty); public string ImageName { get { return (string)GetValue (ImageNameProperty); } set { SetValue (ImageNameProperty, value); } } public static readonly BindableProperty ColorNormalProperty = BindableProperty.Create<FloatingActionButtonView,Color>( p => p.ColorNormal, Color.White); public Color ColorNormal { get { return (Color)GetValue (ColorNormalProperty); } set { SetValue (ColorNormalProperty, value); } } public static readonly BindableProperty ColorPressedProperty = BindableProperty.Create<FloatingActionButtonView,Color>( p => p.ColorPressed, Color.White); public Color ColorPressed { get { return (Color)GetValue (ColorPressedProperty); } set { SetValue (ColorPressedProperty, value); } } public static readonly BindableProperty ColorRippleProperty = BindableProperty.Create<FloatingActionButtonView,Color>( p => p.ColorRipple, Color.White); public Color ColorRipple { get { return (Color)GetValue (ColorRippleProperty); } set { SetValue (ColorRippleProperty, value); } } ... } 

A continuación, asignaremos cada propiedad a una propiedad correspondiente en el control FAB nativo.

Adjuntar un procesador

Si queremos usar un control nativo en Xamarin.Forms, necesitamos un renderizador. Para simplificar, vamos a utilizar un ViewRenderer . Este renderizador asignará nuestro FloatingActionButtonView personalizado a un Android.Widget.FrameLayout .

 public class FloatingActionButtonViewRenderer : ViewRenderer<FloatingActionButtonView, FrameLayout> { ... private readonly Android.Content.Context context; private readonly FloatingActionButton fab; public FloatingActionButtonViewRenderer() { context = Xamarin.Forms.Forms.Context; fab = new FloatingActionButton(context); ... } protected override void OnElementChanged(ElementChangedEventArgs<FloatingActionButtonView> e) { base.OnElementChanged(e); if (e.OldElement != null || this.Element == null) return; if (e.OldElement != null) e.OldElement.PropertyChanged -= HandlePropertyChanged; if (this.Element != null) { //UpdateContent (); this.Element.PropertyChanged += HandlePropertyChanged; } Element.Show = Show; Element.Hide = Hide; SetFabImage(Element.ImageName); fab.ColorNormal = Element.ColorNormal.ToAndroid(); fab.ColorPressed = Element.ColorPressed.ToAndroid(); fab.ColorRipple = Element.ColorRipple.ToAndroid(); var frame = new FrameLayout(Forms.Context); frame.RemoveAllViews(); frame.AddView(fab); SetNativeControl (frame); } public void Show(bool animate = true) { fab.Show(animate); } public void Hide(bool animate = true) { fab.Hide(animate); } void HandlePropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == "Content") { Tracker.UpdateLayout (); } else if (e.PropertyName == FloatingActionButtonView.ColorNormalProperty.PropertyName) { fab.ColorNormal = Element.ColorNormal.ToAndroid(); } else if (e.PropertyName == FloatingActionButtonView.ColorPressedProperty.PropertyName) { fab.ColorPressed = Element.ColorPressed.ToAndroid(); } else if (e.PropertyName == FloatingActionButtonView.ColorRippleProperty.PropertyName) { fab.ColorRipple = Element.ColorRipple.ToAndroid(); } ... } void SetFabImage(string imageName) { if(!string.IsNullOrWhiteSpace(imageName)) { try { var drawableNameWithoutExtension = Path.GetFileNameWithoutExtension(imageName); var resources = context.Resources; var imageResourceName = resources.GetIdentifier(drawableNameWithoutExtension, "drawable", context.PackageName); fab.SetImageBitmap(Android.Graphics.BitmapFactory.DecodeResource(context.Resources, imageResourceName)); } catch(Exception ex) { throw new FileNotFoundException("There was no Android Drawable by that name.", ex); } } } } 

Juntar todos juntos

¡DE ACUERDO! Hemos creado el control personalizado y lo hemos asignado a un renderizador. El último paso es establecer el control en nuestra opinión.

 public class MainPage : ContentPage { public MainPage() { var fab = new FloatingActionButtonView() { ImageName = "ic_add.png", ColorNormal = Color.FromHex("ff3498db"), ColorPressed = Color.Black, ColorRipple = Color.FromHex("ff3498db") }; // Main page layout var pageLayout = new StackLayout { Children = { new Label { VerticalOptions = LayoutOptions.CenterAndExpand, XAlign = TextAlignment.Center, Text = "Welcome to Xamarin Forms!" } }}; var absolute = new AbsoluteLayout() { VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand }; // Position the pageLayout to fill the entire screen. // Manage positioning of child elements on the page by editing the pageLayout. AbsoluteLayout.SetLayoutFlags(pageLayout, AbsoluteLayoutFlags.All); AbsoluteLayout.SetLayoutBounds(pageLayout, new Rectangle(0f, 0f, 1f, 1f)); absolute.Children.Add(pageLayout); // Overlay the FAB in the bottom-right corner AbsoluteLayout.SetLayoutFlags(fab, AbsoluteLayoutFlags.PositionProportional); AbsoluteLayout.SetLayoutBounds(fab, new Rectangle(1f, 1f, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize)); absolute.Children.Add(fab); Content = absolute; } } 

Código completo en Github: Botón de acción flotante Xamarin.Forms

  • Cómo agregar evento de clic en la disposición o marco de pila
  • GetObject <T> de Akavache se bloquea cuando se espera. Alguna idea de lo que está mal aquí?
  • Xamarin.forms mezclando ContentPage y la actividad de Android
  • Xamarin.Droid causando errores de compilación en Visual Studio 2015 cuando se utiliza Xamarin.Forms
  • Xamarin Forms ListView Programatic Refresh No se detiene en Android cuando se carga la página
  • Evitar el cierre por botón de nuevo en formularios xamarin en android
  • Xamarin forma la posición de los elementos de la barra de herramientas para Android
  • ¿Por qué Xamarin.Forms es tan lento al mostrar algunas etiquetas (especialmente en Android)?
  • Xamarin.Android no pudo implementar los proyectos en el emulador de Visual Studio para Android
  • Xamarin Forms Android App Crashes ejecutando Debug con VS Android emulador
  • Cómo obtener / detectar el tamaño de la pantalla en Xamarin.Forms?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.