web-dev-qa-db-fra.com

Comment créer un Android Spinner en tant que popup?

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             
56
Edwin Evans

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!

107
schwiz

Dans xml il y a une option

Android:spinnerMode="dialog"

utiliser ceci pour mode dialogue

83
user2582324

Essayez ceci:

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

Voir ceci lien pour plus de détails.

17
haotang

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.

10
adamp

Ajout d'un petit attribut comme Android:spinnerMode="dialog" afficherait le contenu de la visière dans une fenêtre contextuelle.

9
San

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.

Commencez par la mise en page:

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>

Ensuite, créez la classe:

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();
            }
        });
    }
}

Enfin, utilisez-le comme:

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

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

2
Roger Keays

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

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

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()
0
grantespo

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);
0
Ektos974