wake-up-neo.com

Wie erstelle ich einen Android Spinner als Popup?

Ich möchte einen Drehfelddialog aufrufen, wenn der Benutzer auf ein Menüelement tippt, damit der Benutzer ein Element auswählen kann.

Benötige ich dazu einen eigenen Dialog oder kann ich Spinner direkt nutzen? Ich sehe dieser Link erwähnt eine MODE_DIALOG-Option, aber sie scheint nicht mehr definiert zu sein. AlertDialog mag in Ordnung sein, aber alle Optionen sagen "Wenn Sie auf ein Element in der Liste klicken, wird der Dialog nicht geschlossen", was ich möchte. Irgendein Vorschlag?

Im Idealfall ähnelt der Code dem Fall, in dem der Spinner auf dem Bildschirm angezeigt wird:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity,
     Android.R.layout.simple_spinner_item, items);              
adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
myspinner.setAdapter(adapter);  
// myspinner.showAsDialog() <-- what i want             
56
Edwin Evans

Sie können einen Warndialog verwenden

    AlertDialog.Builder b = new Builder(this);
    b.setTitle("Example");
    String[] types = {"By Zip", "By Category"};
    b.setItems(types, new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

            dialog.dismiss();
            switch(which){
            case 0:
                onZipRequested();
                break;
            case 1:
                onCategoryRequested();
                break;
            }
        }

    });

    b.show();

Dadurch wird der Dialog geschlossen, wenn einer von ihnen wie gewünscht gedrückt wird. Hoffe das hilft!

107
schwiz

In xml gibt es eine Option

Android:spinnerMode="dialog"

verwenden Sie dies für Dialogmodus

83
user2582324

Versuchen Sie dies:

Spinner popupSpinner = new Spinner(context, Spinner.MODE_DIALOG);

Siehe dazu link für mehr Details.

17
haotang

MODE_DIALOG und MODE_DROPDOWN sind in API 11 (Honeycomb) definiert. MODE_DIALOG beschreibt das übliche Verhalten in früheren Plattformversionen.

10
adamp

Hinzufügen eines kleinen Attributs als Android:spinnerMode="dialog" würde den Spinnerinhalt in einem Popup anzeigen.

9
San

Sie können Ihr eigenes benutzerdefiniertes Dialogfeld erstellen. Es ist ziemlich einfach. Wenn Sie es mit einer Auswahl im Drehfeld schließen möchten, fügen Sie ein OnItemClickListener hinzu und fügen Sie hinzu

int n = mSpinner.getSelectedItemPosition();
mReadyListener.ready(n);
SpinnerDialog.this.dismiss();

wie im OnClickListener für den OK-Button. Es gibt jedoch eine Einschränkung: Der On-Click-Listener wird nicht ausgelöst, wenn Sie die Standardoption erneut auswählen. Sie benötigen auch die Schaltfläche OK.

Beginnen Sie mit dem Layout:

res/layout/spinner_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="wrap_content" 
  Android:layout_height="wrap_content">
<TextView 
    Android:id="@+id/dialog_label" 
    Android:layout_height="wrap_content" 
    Android:layout_width="fill_parent"
    Android:hint="Please select an option" 
    />
<Spinner
    Android:id="@+id/dialog_spinner" 
    Android:layout_height="wrap_content" 
    Android:layout_width="fill_parent"
    />
<Button
    Android:id="@+id/dialogOK" 
    Android:layout_width="120dp"
    Android:layout_height="wrap_content" 
    Android:text="OK"
    Android:layout_below="@id/dialog_spinner"
    />
<Button
    Android:id="@+id/dialogCancel" 
    Android:layout_width="120dp"
    Android:layout_height="wrap_content" 
    Android:text="Cancel"
    Android:layout_below="@id/dialog_spinner"
    Android:layout_toRightOf="@id/dialogOK"
    />
</RelativeLayout>

Dann erstelle die Klasse:

src/your/package/SpinnerDialog.Java:

public class SpinnerDialog extends Dialog {
    private ArrayList<String> mList;
    private Context mContext;
    private Spinner mSpinner;

   public interface DialogListener {
        public void ready(int n);
        public void cancelled();
    }

    private DialogListener mReadyListener;

    public SpinnerDialog(Context context, ArrayList<String> list, DialogListener readyListener) {
        super(context);
        mReadyListener = readyListener;
        mContext = context;
        mList = new ArrayList<String>();
        mList = list;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.spinner_dialog);
        mSpinner = (Spinner) findViewById (R.id.dialog_spinner);
        ArrayAdapter<String> adapter = new ArrayAdapter<String> (mContext, Android.R.layout.simple_spinner_dropdown_item, mList);
        mSpinner.setAdapter(adapter);

        Button buttonOK = (Button) findViewById(R.id.dialogOK);
        Button buttonCancel = (Button) findViewById(R.id.dialogCancel);
        buttonOK.setOnClickListener(new Android.view.View.OnClickListener(){
            public void onClick(View v) {
                int n = mSpinner.getSelectedItemPosition();
                mReadyListener.ready(n);
                SpinnerDialog.this.dismiss();
            }
        });
        buttonCancel.setOnClickListener(new Android.view.View.OnClickListener(){
            public void onClick(View v) {
                mReadyListener.cancelled();
                SpinnerDialog.this.dismiss();
            }
        });
    }
}

Verwenden Sie es schließlich als:

mSpinnerDialog = new SpinnerDialog(this, mTimers, new SpinnerDialog.DialogListener() {
  public void cancelled() {
    // do your code here
  }
  public void ready(int n) {
    // do your code here
  }
});
6
Aleadam

Hier ist eine Spinner-Unterklasse, die performClick () überschreibt, um ein Dialogfeld anstelle eines Dropdowns anzuzeigen. Kein XML erforderlich. Probieren Sie es aus, lassen Sie es mich wissen, wenn es für Sie funktioniert.

public class DialogSpinner extends Spinner {
    public DialogSpinner(Context context) {
        super(context);
    }

    @Override 
    public boolean performClick() {
        new AlertDialog.Builder(getContext()).setAdapter((ListAdapter) getAdapter(), 
            new DialogInterface.OnClickListener() {
                @Override public void onClick(DialogInterface dialog, int which) {
                    setSelection(which);
                    dialog.dismiss();
                }
            }).create().show();
        return true;
    }
}

Für weitere Informationen lesen Sie diesen Artikel: How To Make Android Spinner Options Popup In A Dialog

2
Roger Keays

Sie können einen Spinner verwenden und den spinnerMode auf dialog setzen und layout_width und layout_height auf 0 setzen, damit in der Hauptansicht nicht nur der Dialog angezeigt wird (Dropdown-Ansicht). Rufen Sie performClick im Listener auf.

    mButtonAdd.setOnClickListener(view -> {
        spinnerAddToList.performClick();
    });

Layout:

    <Spinner
        Android:id="@+id/spinnerAddToList"
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        Android:layout_marginTop="10dp"
        Android:Prompt="@string/select_from_list"
        Android:theme="@style/ThemeOverlay.AppCompat.Light"
        Android:spinnerMode="dialog"/>

Dies hat den Vorteil, dass Sie Ihren Spinner nach Ihren Wünschen anpassen können.

Siehe meine Antwort hier zum Anpassen von Spinner: Überschreiben des Dropdown-Listenstils für Spinner im Dialogmodus

2
live-love
Android:spinnerMode="dialog"

// Creating adapter for spinner

ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,Android.R.layout.simple_spinner_item, categories);

// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

// attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
1
nzala

Wenn Sie es als Popup im Vollbildmodus anzeigen möchten, benötigen Sie nicht einmal ein XML-Layout. So geht's in Kotlin.

 val inputArray: Array<String> = arrayOf("Item 1","Item 2")
                val alt_bld =  AlertDialog.Builder(context);
                alt_bld.setTitle("Items:")
                alt_bld.setSingleChoiceItems(inputArray, -1) { dialog, which ->
                    if(which == 0){
                        //Item 1 Selected
                    }
                    else if(which == 1){
                        //Item 2 Selected
                    }
                    dialog.dismiss();

                }

                val alert11 = alt_bld.create()
                alert11.show()
0
grantespo

Dies ist aus dem Android SDK-Quellcode. Wie Sie sehen, haben Sie einen speziellen Konstruktor, um einen Spinner mit dem angegebenen Modus zu erstellen, den Sie verwenden möchten.

Hoffe es wird dir helfen :)

 /**
     * Construct a new spinner with the given context's theme, the supplied attribute set,
     * and default style. <code>mode</code> may be one of {@link #MODE_DIALOG} or
     * {@link #MODE_DROPDOWN} and determines how the user will select choices from the spinner.
     *
     * @param context The Context the view is running in, through which it can
     *        access the current theme, resources, etc.
     * @param attrs The attributes of the XML tag that is inflating the view.
     * @param defStyle The default style to apply to this view. If 0, no style
     *        will be applied (beyond what is included in the theme). This may
     *        either be an attribute resource, whose value will be retrieved
     *        from the current theme, or an explicit style resource.
     * @param mode Constant describing how the user will select choices from the spinner.
     * 
     * @see #MODE_DIALOG
     * @see #MODE_DROPDOWN
     */
    public Spinner(Context context, AttributeSet attrs, int defStyle, int mode) {
        super(context, attrs, defStyle);
0
Ektos974