wake-up-neo.com

Android: Spinner Hinweis

Gibt es sowieso einen Hinweis für ein Drehfeld ähnlich dem Hinweis, der zum Bearbeiten von Textfeldern vorgesehen ist. Ich weiß, dass Sie eine Eingabeaufforderung verwenden können, die eine Titelleiste enthält, das Feld für den ersten Drehpunkt jedoch leer lässt, bis Sie in den Drehpunkt klicken. Ich habe derzeit eine grobe Methode, ein Dummy-Feld als ersten Teil des Spinner-Arrays festzulegen, bei dem es sich um die Frage handelt, und am Ende zu überprüfen, ob der Spinner nicht mit der Frage übereinstimmt. Gibt es dafür einen saubereren/besseren Weg?

Vielen Dank!

51
Nick

Hier ist eine Lösung, die wahrscheinlich ein bisschen einfacher ist als der Code von Ravi Vyas (danke für die Inspiration!):

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), Android.R.layout.simple_spinner_dropdown_item) {

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = super.getView(position, convertView, parent);
        if (position == getCount()) {
            ((TextView)v.findViewById(Android.R.id.text1)).setText("");
            ((TextView)v.findViewById(Android.R.id.text1)).setHint(getItem(getCount())); //"Hint to be displayed"
        }

        return v;
    }       

    @Override
    public int getCount() {
        return super.getCount()-1; // you dont display last item. It is used as hint.
    }

};

adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
adapter.add("Item 1");
adapter.add("Item 2");
adapter.add("Hint to be displayed");

spinner.setAdapter(adapter);
spinner.setSelection(adapter.getCount()); //display hint
146
Boni2k

Sie können Ihren eigenen Spinner-Adapter einrichten und die getView-Methode überschreiben, um den Hinweis anstelle eines Elements anzuzeigen. Ich habe ein Beispielprojekt auf Github erstellt, probiere es aus hier

23
Ravi Vyas

Eine noch einfachere Möglichkeit, als Ihren eigenen Spinner-Adapter einzurichten, besteht darin, einfach eine Schaltfläche zu verwenden und sie wie ein Spinner-Objekt mit zu stylen

Android:background="@Android:drawable/btn_dropdown"

Richten Sie dann das onClick-Ereignis der Schaltfläche ein, um ein Dialogfeld zur Auswahl einzelner Elemente zu öffnen. Sie können dann mit dem Text der Schaltfläche tun, was Sie wollen.

Dies war für eine Weile meine bevorzugte Art, damit umzugehen. Hoffe es hilft jemandem.

EDIT: Ich habe kürzlich wieder damit herumgespielt (und jemand hat mich vor einiger Zeit gebeten, ein Beispiel zu posten). Diese Strategie sieht etwas anders aus, wenn Sie das Holo-Thema verwenden. Wenn Sie jedoch andere Themen wie Theme.Black verwenden, sieht dies identisch aus.

Um dies zu demonstrieren, habe ich eine einfache App erstellt, die sowohl einen regulären Spinner als auch einen benutzerdefinierten Button-Spinner enthält. Ich habe das in einem GitHub-Repo ausgegeben, aber so sieht die Aktivität aus:

package com.stevebergamini.spinnerbutton;

import Android.app.Activity;
import Android.app.AlertDialog;
import Android.content.DialogInterface;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.Spinner;

public class MainActivity extends Activity {

    Spinner spinner1;
    Button button1;
    AlertDialog ad;
    String[] countries;

    int selected = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spinner1 = (Spinner) findViewById(R.id.spinner1);
        button1 = (Button) findViewById(R.id.button1);

        countries = getResources().getStringArray(R.array.country_names);

        //  You can also use an adapter for the allert dialog if you'd like
        //  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, Android.R.layout.simple_spinner_dropdown_item, countries);        

        ad = new AlertDialog.Builder(MainActivity.this).setSingleChoiceItems(countries, selected,  
                new  DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            button1.setText(countries[which]);
                            selected = which;
                            ad.dismiss();

                        }}).setTitle(R.string.select_country).create(); 


        button1.setOnClickListener( new OnClickListener(){

            @Override
            public void onClick(View v) {
                ad.getListView().setSelection(selected);
                ad.show();              
            }});

    }
}
15
SBerg413