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
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!
In xml gibt es eine Option
Android:spinnerMode="dialog"
verwenden Sie dies für Dialogmodus
Versuchen Sie dies:
Spinner popupSpinner = new Spinner(context, Spinner.MODE_DIALOG);
Siehe dazu link für mehr Details.
MODE_DIALOG
und MODE_DROPDOWN
sind in API 11 (Honeycomb) definiert. MODE_DIALOG
beschreibt das übliche Verhalten in früheren Plattformversionen.
Hinzufügen eines kleinen Attributs als Android:spinnerMode="dialog"
würde den Spinnerinhalt in einem Popup anzeigen.
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.
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>
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();
}
});
}
}
mSpinnerDialog = new SpinnerDialog(this, mTimers, new SpinnerDialog.DialogListener() {
public void cancelled() {
// do your code here
}
public void ready(int n) {
// do your code here
}
});
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
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
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);
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()
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);