Je souhaite afficher une boîte de dialogue de rotation lorsque l'utilisateur appuie sur un élément de menu pour lui permettre de sélectionner un élément.
Ai-je besoin d'un dialogue séparé pour cela ou puis-je utiliser directement Spinner? Je vois ce lien, mentionne une option MODE_DIALOG mais elle ne semble plus être définie. AlertDialog est peut-être OK, mais toutes les options disent "cliquer sur un élément de la liste ne fera pas disparaître le dialogue", ce que je veux. Toute suggestion?
Idéalement, le code serait similaire au cas où la visionneuse est affichée à l'écran:
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
Vous pouvez utiliser un dialogue d'alerte
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();
Cela fermera la boîte de dialogue lorsque vous appuierez sur l'un d'eux comme vous le souhaitez. J'espère que cela t'aides!
Dans xml il y a une option
Android:spinnerMode="dialog"
utiliser ceci pour mode dialogue
Essayez ceci:
Spinner popupSpinner = new Spinner(context, Spinner.MODE_DIALOG);
Voir ceci lien pour plus de détails.
MODE_DIALOG
et MODE_DROPDOWN
sont définis dans l’API 11 (Honeycomb). MODE_DIALOG
décrit le comportement habituel des versions précédentes de la plate-forme.
Ajout d'un petit attribut comme Android:spinnerMode="dialog"
afficherait le contenu de la visière dans une fenêtre contextuelle.
Vous pouvez créer votre propre dialogue personnalisé. C'est assez facile. Si vous voulez le supprimer avec une sélection dans le compteur, ajoutez alors un OnItemClickListener
et ajoutez
int n = mSpinner.getSelectedItemPosition();
mReadyListener.ready(n);
SpinnerDialog.this.dismiss();
comme dans OnClickListener pour le bouton OK. Cependant, il y a une mise en garde: l'écouteur onclick ne se déclenche pas si vous resélectionnez l'option par défaut. Vous avez également besoin du bouton 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/votre/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
}
});
Voici une sous-classe Spinner qui substitue performClick () pour afficher une boîte de dialogue au lieu d'un menu déroulant. Aucun XML requis. Essayez, laissez-moi savoir si cela fonctionne pour vous.
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;
}
}
Pour plus d'informations, lisez cet article: Comment créer Android Spinner Options Popup dans une boîte de dialogue
Vous pouvez utiliser un spinner et définir spinnerMode sur dialog, puis définir layout_width et layout_height sur 0, de sorte que la vue principale ne s'affiche pas, mais uniquement la boîte de dialogue (vue déroulante). Appelez performClick dans le bouton clic écouteur.
mButtonAdd.setOnClickListener(view -> {
spinnerAddToList.performClick();
});
Disposition:
<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"/>
L'avantage est que vous pouvez personnaliser votre spinner comme bon vous semble.
Voir ma réponse ici pour personnaliser Spinner: Remplacement du style de liste déroulante pour Spinner en mode Dialogue
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);
Si vous souhaitez l'afficher sous forme de popup en plein écran, vous n'avez même pas besoin d'une mise en page XML. Voici comment faire à 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()
C’est à partir du code source du SDK Android. Comme vous pouvez le constater, vous avez un constructeur spécial pour créer un spinner avec le mode spécifié que vous souhaitez utiliser.
J'espère que ça vous aidera :)
/**
* 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);