wake-up-neo.net

So fügen Sie einen Hinweis in Spinner in XML hinzu

Ich versuche, einen Hinweis in das Spinner-Widget einzufügen, da es keine Option für Hinweis gibt, wie in EditText. Ich möchte Geschlecht als Hinweis anzeigen. Wenn Sie darauf klicken, muss nur der männliche und der weibliche Hinweis angezeigt werden. 

Wie kann das gemacht werden? Nur mit XML

XML-Code des Spinners.

  <Spinner
      Android:layout_width="match_parent"
      Android:layout_height="wrap_content"
      Android:id="@+id/spinner1"
      Android:entries="@array/gender"
      Android:layout_marginTop="10dp"
      Android:layout_marginLeft="25dp"
      Android:layout_marginRight="25dp"
      Android:layout_gravity="center_horizontal" />

String Array des Spinners

<string-array name="gender">
     <item>Male</item>
     <item>Female</item>
</string-array>
33
A-JaY

Im Adapter können Sie das erste Element als deaktiviert festlegen. Unten ist der Beispielcode

@Override
public boolean isEnabled(int position) {
    if (position == 0) {
        // Disable the first item from Spinner
        // First item will be use for hint
        return false;
    } else {
        return true;
    }
}

Legen Sie für das erste Element die Farbe Grau fest.

@Override
public View getDropDownView(int position, View convertView,
                                    ViewGroup parent) {
    View view = super.getDropDownView(position, convertView, parent);
    TextView tv = (TextView) view;
    if (position == 0) {
        // Set the hint text color gray
        tv.setTextColor(Color.GRAY);
    } else {
        tv.setTextColor(Color.BLACK);
    }
    return view;
}

Wenn der Benutzer den ersten Artikel auswählt, dann nichts tun.

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    String selectedItemText = (String) parent.getItemAtPosition(position);
    // If user change the default selection
    // First item is disable and it is used for hint
    if (position > 0) {
        // Notify the selected item text
        Toast.makeText(getApplicationContext(), "Selected : " + selectedItemText, Toast.LENGTH_SHORT).show();
    }
}

Einzelheiten finden Sie unter dem folgenden Link.

Wie füge ich einen Spinner in Android hinzu

34
Dotnetpickles

Es gibt zwei Möglichkeiten, Spinner zu verwenden:

statischer Weg

Android:spinnerMode="dialog"

und dann einstellen:

Android:Prompt="@string/hint_resource"

dynamischer Weg

spinner.setPrompt("Gender");

Hinweis: Es funktioniert wie ein Hinweis, ist es aber nicht.

Möge es helfen!

9
Saurabh Vardani

Dies kann auf sehr einfache Weise erfolgen. Anstatt den Adapter mit den integrierten Werten (Android.R.layout.simple_list_item_1) einzustellen, erstellen Sie ein eigenes XML-Layout für TextView und DropDown und verwenden Sie sie. Definieren Sie im TextView-Layout Hinweistext und -farbe. Im letzten Schritt erstellen und leeren Sie das Element als erstes Element in dem in Strings definierten Elementarray. 

<string-array name="professional_qualification_array">
    <item></item>
    <item>B.Pharm</item>
    <item>M.Pharm</item>
    <item>PharmD</item>
</string-array>

XML-Layout für Spinner TextView erstellen ( spnr_qualification.xml )

<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@Android:id/text1"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:textSize="20sp"
    Android:hint="Qualification"
    Android:textColorHint="@color/light_gray"
    Android:textColor="@color/blue_black" />

Erstellen Sie ein XML-Layout für DropDown ( drpdn_qual.xml ).

<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@Android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
Android:maxLines="1"
Android:layout_width="match_parent"
Android:layout_height="?android:attr/listPreferredItemHeight"
Android:ellipsize="Marquee"
Android:textColor="#FFFFFF"/>

Definieren Sie den Spinner im Haupt-XML-Layout

<Spinner
Android:id="@+id/spnQualification"
Android:layout_width="match_parent"
Android:layout_height="40dp"
Android:layout_marginTop="10dp"
Android:paddingLeft="10dp"
Android:paddingBottom="5dp"
Android:paddingTop="5dp"
/>

Verwenden Sie schließlich Ihr eigenes XML-Layout, während Sie den Code für den Spinner festlegen.

ArrayAdapter<CharSequence> qual_adapter = ArrayAdapter.createFromResource(this, R.array.professional_qualification_array,R.layout.spnr_qualification);

qual_adapter.setDropDownViewResource(R.layout.drpdn_qual);

spnQualification.setAdapter(qual_adapter)
4

Schritt 1:

Ihr Array sieht aus wie. letzter Punkt dein Hinweis

Bsp .: private Zeichenfolge [] yourArray = neue Zeichenfolge [] {"Staff", "Student", "Your Hint"};

Schritt 2:

HintAdpater.Java erstellen (einfach kopieren und einfügen)

Diese Klasse gibt den letzten Eintrag nicht zurück. Ihr Hinweis wird also nicht angezeigt.

HintAdapter.Java

package ajax.com.vvcoe.utils;

import Android.content.Context;
import Android.widget.ArrayAdapter;

import Java.util.List;


public class HintAdapter  extends ArrayAdapter<String> {


public HintAdapter(Context context, int resource) {
    super(context, resource);
}

public HintAdapter(Context context, int resource, int textViewResourceId) {
    super(context, resource, textViewResourceId);
}

public HintAdapter(Context context, int resource, String[] objects) {
    super(context, resource, objects);
}

public HintAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
    super(context, resource, textViewResourceId, objects);
}

public HintAdapter(Context context, int resource, List<String> objects) {
    super(context, resource, objects);
}

public HintAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
    super(context, resource, textViewResourceId, objects);
}

@Override
public int getCount() {
    // don't display last item. It is used as hint.
    int count = super.getCount();
    return count > 0 ? count - 1 : count;
}
}

Schritt 3:

Spinner-Adapter so einstellen

    HintAdapter hintAdapter=new HintAdapter(this,Android.R.layout.simple_list_item_1,yourArray);
    yourSpinner.setAdapter(hintAdapter);
    // show hint
    yourSpinner.setSelection(hintAdapter.getCount());

Gutschrift geht an @Yakiv Mospan Von dieser Antwort - https://stackoverflow.com/a/22774285/3879847

Ich ändere nur einige Änderungen ..

3
Ranjith Kumar

Der Trick ist diese Linie

((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.login_input_hint_color));

verwenden Sie es im onItemSelected. Hier ist mein Code mit mehr Kontext

List<String> list = getLabels(); // First item will be the placeholder
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(mContext, Android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                // First item will be gray
                if (position == 0) {
                    ((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.login_input_hint_color));
                } else {
                    ((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.primary_text));
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
2
David Rearte

machen Sie Ihren Hinweis an der Endposition in Ihrem String-Array wie folgt City ist der Hinweis hier 

array_city = new String[]{"Irbed", "Amman", "City"};

und dann in Ihrem Array-Adapter 

ArrayAdapter<String> adapter_city = new ArrayAdapter<String>(getContext(), Android.R.layout.simple_spinner_item, array_city) {
            @Override
            public int getCount() {
                // to show hint "Select Gender" and dont able to select
                return 2;
            }
        };

der Adapter gibt also nur die ersten beiden Elemente und schließlich die Methode onCreate () oder die Methode , aus, die den Hinweis von Spinner auswählen soll 

yourSpinner.setSelection(2);

Sie können das Drehfeld Prompt einstellen:

spinner.setPrompt("Select gender...");
0
Sam

Ich habe es geschafft, einen "Hinweis" hinzuzufügen, der aus der Dropdown-Liste weggelassen wird. Wenn mein Code etwas seltsam aussieht, liegt das daran, dass ich Xamarin.Android verwende, also in C #, aber für alle Absichten (heh) und Zwecke sollte das Java-Äquivalent die gleiche Wirkung haben.

Der Kernpunkt ist, dass ich einen benutzerdefinierten ArrayAdapter erstellt habe, der erkennt, ob es sich um den Hinweis in der GetDropDownView-Methode handelt. In diesem Fall wird eine leere XML-Datei aufgeblasen, um den Hinweis vor dem Dropdown-Menü zu verbergen.

Meine spinnerItem.xml ist ...

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/spinnerText"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:paddingLeft="@dimen/text_left_padding"
    Android:textAppearance="?android:attr/textAppearanceLarge"/>

Meine 'leere' hintSpinnerDropdownItem.xml, die den Hinweis ausblenden wird.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"/>

Ich übergebe ein Array von CustomObj ohne den Hinweis. Deshalb habe ich die zusätzliche AddPrompt-Methode, um den Hinweis am Anfang einzufügen, bevor er an den übergeordneten Konstruktor übergeben wird.

public class CustomArrayAdapter: ArrayAdapter<CustomObj>
{

    private const int HintPosition = 0;
    private const CustomObj HintValue = null;
    private const string Hint = "Hint";

    public CustomArrayAdapter(Context context, int textViewResourceId, CustomObj[] customObjs) : base(context, textViewResourceId, AddPrompt(customObjs))
    {


    private static CustomObj[] AddPrompt(CustomObj[] customObjs)
    {
        CustomObj[] customObjsWithHint = new CustomObj[customObjs.Length + 1];
        CustomObj[] hintPlaceholder = { HintValue };
        Array.Copy(hintPlaceholder , customObjsWithHint , 1);
        Array.Copy(customObjs, 0, customObjsWithHint , 1, customObjs.Length);
        return customObjsWithHint ;
    }

    public override Android.Views.View GetView(int position, Android.Views.View convertView, ViewGroup parent)
    {
        CustomObj customObj = GetItem(position);
        bool isHint = customObj == HintValue;

        if (convertView == null)
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.spinnerItem, parent, false);
        }

        TextView textView = convertView.FindViewById<TextView>(Resource.Id.spinnerText);
        textView.Text = isHint ? Hint : customObj.Value;
        textView.SetTextColor(isHint ? Color.Gray : Color.Black);

        return convertView;

    public override Android.Views.View GetDropDownView(int position, Android.Views.View convertView, ViewGroup parent)
    {
        CustomObj customObj = GetItem(position);

        if (position == HintPosition)
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.hintSpinnerDropdownItem, parent, false);
        }
        else
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.spinnerItem, parent, false);
            TextView textView = convertView.FindViewById<TextView>(Resource.Id.spinnerText);
            textView.Text = customObj.Value;
        }

        return convertView;
    }
}
0
Patrick Ma

Der einfachste Weg, den ich gefunden habe, war folgender: Erstellt ein TextView oder LinearLayout und platziert es zusammen mit dem Spinner in einem RelativeLayout. Anfangs wird der Text als Text angezeigt, als wäre es der Hinweis "Select one ...". Nach dem ersten Klick ist diese TextView unsichtbar, deaktiviert und ruft den Spinner auf, der direkt dahinter steht.

Schritt 1:

In der activity.xml, die den Spinner findet, stelle Folgendes ein:

 <RelativeLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">
    <Spinner
        Android:id="@+id/sp_main"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:spinnerMode="dropdown" />
    <LinearLayout
        Android:id="@+id/ll_hint_spinner"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:gravity="center">
        <TextView

            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:gravity="center"
            Android:text="Select..."/>

    </LinearLayout>
</RelativeLayout>

Schritt 2:

In Ihrem Activity.Java-Typ:

public class MainActivity extends AppCompatActivity {

    private LinearLayout ll_hint_spinner;
    private Spinner sp_main;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ll_hint_spinner = findViewById(R.id.ll_hint_spinner);
        sp_main = findViewById(R.id.sp_main);
        //Action after clicking LinearLayout / Spinner;
        ll_hint_spinner.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //By clicking "Select ..." the Spinner is requested;
                sp_main.performClick();
                //Make LinearLayout invisible
                setLinearVisibility(false);
                //Disable LinearLayout
                ll_hint_spinner.setEnabled(false);
                //After LinearLayout is off, Spinner will function normally;
                sp_main.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        sp_main.setSelection(position);
                    }
                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                        setLinearVisibility(true);
                    }
                });
            }
        });
    }
    //Method to make LinearLayout invisible or visible;
    public void setLinearVisibility(boolean visible) {
        if (visible) {
            ll_hint_spinner.setVisibility(View.VISIBLE);
        } else {
            ll_hint_spinner.setVisibility(View.INVISIBLE);
        }
    }
}

Beispiel1SameExample2SameExample3

In den Beispielen für die Bilder habe ich einen benutzerdefinierten Spinner verwendet, das Ergebnis des letzten Beispiels ist jedoch dasselbe.

Hinweis: Ich habe das Beispiel in github: https://github.com/MurilloComino/Spinner_hint

0
Murillo Comino

Was für mich funktionierte, war, dass Sie Ihren Spinner mit einer Liste von Gegenständen einschließlich des Hinweises am Anfang einrichten würden.

    final MaterialSpinner spinner = (MaterialSpinner) findViewById(R.id.spinner);

    spinner.setItems("Select something in this list", getString(R.string.ABC), getString(R.string.ERD), getString(R.string.KGD), getString(R.string.DFK), getString(R.string.TOE));

Wenn der Benutzer nun tatsächlich etwas in der Liste auswählt, würden Sie die spinner.setItems-Methode verwenden, um die Liste auf alles außer Ihrem Hinweis festzulegen:

       spinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {

            @Override public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
                spinner.setItems(getString(R.string.ABC), getString(R.string.ERD), getString(R.string.KGD), getString(R.string.DFK), getString(R.string.TOE));

}

Der Hinweis wird entfernt, sobald der Benutzer etwas in der Liste auswählt.

0
Simon