Wie kann ich den style der Elemente-Liste in einer Xamarin-Picker (in Android)

Habe ich einen Xamarin Android-Anwendung, die mit einem Picker-wählen Sie aus einer Liste von Werten. Ich habe das ändern der Stil der Anwendung, sondern laufen in Probleme mit dem Picker.
Kann ich zwar einstellen, die Textfarbe, konnte ich nicht die Farbe der Platzhalter-text.

Nach der Suche SO für die Hilfe, ich habe implementiert eine benutzerdefinierte renderer, und ich habe jetzt den text und Platzhalter zeigt in den richtigen text. Aber bisher, wenn ich Sie berührte die Platzhalter-text, der Kind-dialog erschienen und angezeigt, alle die Elemente, mit denen der Anwender einen auswählen. Jetzt habe ich die custom renderer implementiert, der Kind-dialog zeigt nur die obersten zwei Elemente, und der Benutzer hat, um einen Bildlauf durch Sie, bevor Sie auf „OK“.

Habe ich zwei Fragen:

  1. Auf ein minimum, wie kann ich das Kind den dialog mit der vollständigen Liste wieder?
  2. Ist es möglich, die hintergrund-und Textfarbe für die Elemente-Liste-dialog?

Den XAML-Code sieht wie folgt aus:

<c:CustomPicker x:Name="DivisionList" Title="{x:Static prop:Resources.PickerDivision}" 
                        SelectedIndexChanged="DivisionList_SelectedIndexChanged">
    <Picker.Behaviors>
        <b:RequiredPickerValidator x:Name="DivValidator" IsValid="{Binding Path=BindingContext.IsDivisionValid, Mode=OneWayToSource, Source={x:Reference contentPage}}" />
    </Picker.Behaviors>
</c:CustomPicker>

Den CustomPicker Klasse ist wie folgt:

namespace <myapp>.Portable.Controls
{
    public class CustomPicker : Picker
    {
        public Color PlaceholderColour
        {
            get { return (Color)App.Current.Resources["PlaceholderTextColour"]; }
        }

        public Color TextColour
        {
            get { return (Color)App.Current.Resources["LabelTextColour"]; }
        }

        public Color BackgroundColour
        {
            get { return (Color)App.Current.Resources["PaneBackgroundColour"]; }
        }
    }
}

Ist und der Kunde renderer ist dies:

[assembly: ExportRendererAttribute(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace <myapp>.Droid.Controls.Renderers
{
    public class CustomPickerRenderer : PickerRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            Control?.SetPadding(20, 20, 20, 20);
            if (e.OldElement != null || e.NewElement != null)
            {
                var customPicker = e.NewElement as CustomPicker;

                Android.Graphics.Color phCol = customPicker.PlaceholderColour.ToAndroid();
                Android.Graphics.Color textCol = customPicker.TextColour.ToAndroid();
                Android.Graphics.Color bgCol = customPicker.BackgroundColour.ToAndroid();

                Control.SetBackgroundColor(bgCol);
                Control.SetHintTextColor(phCol);
                Control.SetTextColor(textCol);
            }
        }
    }
}

Vielen Dank im Voraus!

Picker popup vor dem custom renderer:
Wie kann ich den style der Elemente-Liste in einer Xamarin-Picker (in Android)

Picker popup nach dem custom renderer:
Wie kann ich den style der Elemente-Liste in einer Xamarin-Picker (in Android)

  • Hallo, haben Sie testen meine Antwort? Hast du dein problem gelöst?
  • Hi, danke für die Antwort. Ja, ich habe es versucht und es hat tatsächlich den dialog aufzurufen definiert, aber ich hoffte, dass der Fortschritt ein wenig weiter, bevor kommentieren. Ich habe jetzt, um herauszufinden, wie die Stile der rest der app, wie alles andere, ist in XAML definiert, die in dem tragbaren Teil des Projekts. Ich bin sehr neu in Xamarin – alle meine bisherige Entwicklung wurde für Windows oder die Verwendung nativer Android….



2 Replies
  1. 1

    Können Sie hinzufügen, Klicken Sie auf Ereignis auf Control, und dann können Sie das benutzerdefinierte Dialogfeld in diesem Dialogfeld können Sie benutzerdefinierte alles, was Sie wollen, hintergrund, Element, text, Farbe, etc.

    In Ihrem CustomPickerRenderer, tun Sie dies:

    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {
        base.OnElementChanged(e);
    
        Control?.SetPadding(20, 20, 20, 20);
        if (e.OldElement != null || e.NewElement != null)
        {
            var customPicker = e.NewElement as CustomPicker;
            ...
            //add click event
            Control.Click += Control_Click;
        }
    }

    Können Sie eine Dialog und custom es-layout, zum Beispiel, fügen Sie ein ListView in seiner Gestaltung, so erhalten Sie den untergeordneten dialog mit der vollständigen Liste:

    private void Control_Click(object sender, EventArgs e)
    {
        Toast.MakeText(Xamarin.Forms.Forms.Context,"111111",ToastLength.Short).Show();
        dialog = new Dialog(Forms.Context);
        dialog.SetContentView(Resource.Layout.dialog);
        Android.Widget.Button b1 = (Android.Widget.Button)dialog.FindViewById(Resource.Id.button1);
        Android.Widget.Button b2 = (Android.Widget.Button)dialog.FindViewById(Resource.Id.button2);
        Android.Widget.ListView listView = (Android.Widget.ListView)dialog.FindViewById(Resource.Id.lv);
        listView.Adapter=new ArrayAdapter<String>(Forms.Context, Android.Resource.Layout.SimpleExpandableListItem1,
            new List<String>() { "111","222","333", "444", "555", "666", "777", "888", "999", });
        b1.Click += B1_Click;
        b2.Click += B2_Click;
        dialog.Show();
    }

    Unten ist dialog layout, Sie können die hintergrund-und Textfarbe für die Elemente-Liste-dialog:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
                  android:orientation="vertical">
      <TextView 
        android:text="123456"
        android:layout_width="match_parent"
          android:layout_height="wrap_content"/>
      <ListView
          android:id="@+id/lv"
          android:layout_width="wrap_content"
          android:layout_height="0dp"
          android:layout_weight="1"/>
      <LinearLayout
        android:layout_width="fill_parent"
          android:layout_height="wrap_content"
        android:orientation="horizontal">
      <Button
          android:id="@+id/button2"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Cancel" />
    
      <Button
          android:id="@+id/button1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Ok" />
      </LinearLayout>
    </LinearLayout>
  2. 4

    Anscheinend gibt es 2 picker Renderer.

    Xamarin.Formen.- Plattform.Android.PickerRenderer &
    Xamarin.Formen.- Plattform.Android.AppCompat.PickerRenderer

    Stellen Sie sicher, dass Sie die Letzte und Ihres Layouts wird das gleiche wie vorher!!!

    Die Quelle wo ich habe meine Antwort:
    https://forums.xamarin.com/discussion/97150/how-to-write-a-custom-renderer-for-bindable-picker-to-change-its-font-attributes-family-size

    Renderer (keine wirkliche Indikation gibt es 2):
    https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/renderers

    • Hallo, vielen Dank für das hinzufügen einer weiteren Antwort (sorry, ich war im Urlaub, als es schon gepostet und übersehen die Benachrichtigung). Ich bin von dem Projekt im moment, aber wird wohl wieder auf das nächste Woche, also werde ich das ausprobieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.