1
votes

Sélecteur de formulaires Xamarin sur fond cliqué

J'ai un sélecteur personnalisé avec ce code en PCL et Android qui est montré ci-dessous.

https://xamgirl.com/picker-with-right-side-icon-in-xamarin-forms/

Le problème est quand je ouvrez le sélecteur et appuyez sur l'arrière-plan, le sélecteur ne s'ouvrira plus. J'ai essayé d'appuyer sur ok et d'annuler le sélecteur agira normalement et pourra à nouveau se concentrer

Y a-t-il un moyen de gérer le clic d'arrière-plan vers le sélecteur pour l'empêcher de sauter à moins que je clique sur annuler ou ok?

PCL:

using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.Support.V4.Content;
using AppXamarin;
using AppXamarin.Droid;
using Plugin.CurrentActivity;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace AppXamarin.Droid
{
    public class CustomPickerRenderer : PickerRenderer
    {
        CustomPicker element;
        public CustomPickerRenderer(Context context) : base(context)
        {
            AutoPackage = false;
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            element = (CustomPicker)this.Element;

            if (Control != null && this.Element != null && !string.IsNullOrEmpty(element.Image))
            {
                Control.Background = AddPickerStyles(element.Image);   
            }
        }
        public LayerDrawable AddPickerStyles(string imagePath)
        {
            ShapeDrawable border = new ShapeDrawable();
            border.Paint.Color = Android.Graphics.Color.Gray;
            border.SetPadding(10, 10, 10, 10);
            border.Paint.SetStyle(Paint.Style.Stroke);

            Drawable[] layers = { border, GetDrawable(imagePath) };
            LayerDrawable layerDrawable = new LayerDrawable(layers);
            layerDrawable.SetLayerInset(0, 0, 0, 0, 0);

            return layerDrawable;
        }
        private BitmapDrawable GetDrawable(string imagePath)
        {
            //int resID = Resources.GetIdentifier(imagePath, "drawable", this.Context.PackageName);
            var drawable = Resources.GetDrawable(imagePath);
            var bitmap = ((BitmapDrawable)drawable).Bitmap;
            var result = new BitmapDrawable(Resources, Bitmap.CreateScaledBitmap(bitmap, 70, 70, true));
            result.Gravity = Android.Views.GravityFlags.CenterVertical;
            return result;
        }

    }
}

Android:

   using Xamarin.Forms;

namespace AppXamarin
{
    public class CustomPicker : Picker
    {
        public static readonly BindableProperty ImageProperty =
            BindableProperty.Create(nameof(Image), typeof(string), typeof(CustomPicker), string.Empty);
        public string Image
        {
            get { return (string)GetValue(ImageProperty); }
            set { SetValue(ImageProperty, value); }
        }
    }
}


8 commentaires

Ajoutez votre code, laissez-moi jeter un œil


Mon code est le même que dans l'URL de ma question, mais j'ai modifié ma question avec le code de rendu PCL et Android


Donc ce qui se passe, c'est que vous cliquez sur le sélecteur qu'il ouvre et la prochaine fois que vous cliquez dessus, non?


la première fois que je clique, il s'ouvre, lorsque je clique sur ok ou annuler, la prochaine fois que je clique, il s'ouvre normalement. Mais lorsque je clique sur l'arrière-plan du sélecteur, il se ferme et lorsque j'essaye de l'ouvrir à nouveau, il ne s'ouvre pas. Si vous êtes confus, je peux essayer de reformuler ce que j'ai dit


J'ai compris votre problème, est-ce que cela se produit sous Android ou iOS à la fois


pour l'instant, je teste sur Android. Je vais le vérifier sur iOS et vous donner le feedback


En attendant, laissez-moi savoir


@ mohammad, j'essaie votre code, mais je ne peux pas reproduire votre problème, pouvez-vous fournir un .gif ici, laissez-moi jeter un œil à votre problème, quelle est la version de Xamarin.Forms?


3 Réponses :


2
votes

Il existe en fait deux PickerRenderer, le Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer et le basique Xamarin.Forms.Platform.Android , le basique a ce problème ce que vous devez faire est quelque chose comme pour vous Android Renderer:

using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Xamarin.Forms.Platform.Android;
using AppXamarin;
using AppXamarin.Droid;
using Plugin.CurrentActivity;
using Xamarin.Forms;


[assembly: ExportRenderer(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace AppXamarin.Droid
{
     public class CustomPickerRenderer : Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer
    {
        private CustomPicker element;
        public CustomPickerRenderer(Context context) : base(context)
        {
            AutoPackage = false;
        }
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
            element = (CustomPicker)this.Element;

            if (Control != null && this.Element != null && !string.IsNullOrEmpty(element.Image))
            {
                Control.Background = AddPickerStyles(element.Image);
            }
        }
        public LayerDrawable AddPickerStyles(string imagePath)
        {
            ShapeDrawable border = new ShapeDrawable();
            border.Paint.Color = Android.Graphics.Color.Gray;
            border.SetPadding(10, 10, 10, 10);
            border.Paint.SetStyle(Paint.Style.Stroke);

            Drawable[] layers = { border, GetDrawable(imagePath) };
            LayerDrawable layerDrawable = new LayerDrawable(layers);
            layerDrawable.SetLayerInset(0, 0, 0, 0, 0);

            return layerDrawable;
        }
        private BitmapDrawable GetDrawable(string imagePath)
        {
            //int resID = Resources.GetIdentifier(imagePath, "drawable", this.Context.PackageName);
            var drawable = Resources.GetDrawable(imagePath);
            var bitmap = ((BitmapDrawable)drawable).Bitmap;
            var result = new BitmapDrawable(Resources, Bitmap.CreateScaledBitmap(bitmap, 70, 70, true));
            result.Gravity = Android.Views.GravityFlags.CenterVertical;
            return result;
        }
    }
}


2 commentaires

Celui-ci: Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer me donne des erreurs: "onElementChanged" et "var drawable = Resources.GetDrawable (imagePath);" qui ne peut pas être corrigé


Mise à jour jeter un coup d'oeil



0
votes

Je viens de le résoudre en rétrogradant ma version de Xamarin.Forms, j'avais une version préliminaire installée. Merci à tous pour votre aide!


2 commentaires

vers quelle version avez-vous rétrogradé?


à la version: 3.4.0.1008975



0
votes

hérite juste du suivant, ça marche très bien pour moi

classe publique CustomPickerRenderer: Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer


0 commentaires