Comment créer un Spinner Android comme popup?

je veux apporter un spinner boîte de dialogue lorsque l'utilisateur sélectionne un élément de menu permet à l'utilisateur de sélectionner un élément.

ai-je besoin d'un dialogue séparé pour cela ou Puis-je utiliser Spinner directement? Je vois ce lien, mentionne une option MODE_DIALOG mais elle ne semble plus être définie. AlertDialog peut être OK mais toutes les options disent "cliquer sur un élément dans la liste ne va pas rejeter le dialogue" ce qui est ce que je veux. Toute suggestion?

idéalement, le code serait similaire au cas où le fileur est affiché à 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             
42
demandé sur KRP 2011-06-09 04:32:56

10 réponses

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 le dialogue quand l'un d'eux est pressé comme vous le voulez. Espérons que cette aide!

101
répondu schwiz 2011-06-09 04:17:50

Dans xml il y a une option

android:spinnerMode="dialog"

utilisez ceci pour mode de dialogue

60
répondu user2582324 2018-02-27 07:16:58

essayez ceci:

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

voir ce lien pour plus de détails.

15
répondu haotang 2018-02-27 07:16:15

MODE_DIALOG et MODE_DROPDOWN sont définis dans API 11 (Honeycomb). MODE_DIALOG décrit le comportement habituel dans les versions précédentes de la plate-forme.

10
répondu adamp 2011-06-09 00:37:40

Ajouter un petit attribut comme android:spinnerMode="dialog" montrerait le contenu de spinner dans un pop-up.

9
répondu San 2015-08-27 12:53:08

vous pouvez créer votre propre dialogue personnalisé. Il est assez facile. Si vous voulez le rejeter avec une sélection dans le spinner, puis Ajouter un OnItemClickListener et ajouter

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

comme dans L'OnClickListener pour le bouton OK. Il y a une mise en garde, cependant, et c'est que l'écouteur onclick ne démarre pas si vous resélectionnez l'option par défaut. Vous avez aussi besoin du bouton OK.

commence par la disposition:

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éer 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
répondu Aleadam 2018-01-11 23:22:38

Voici une sous-classe Spinner qui remplace performClick() pour afficher un dialogue au lieu d'un dropdown. Aucun XML requis. Essayez, dites-moi si ça marche 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, lire l'article: Comment faire apparaître les Options de Spinner Android dans un dialogue

2
répondu Roger Keays 2014-05-28 12:20:40
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
répondu nzala 2016-10-07 10:33:04

ça vient du code source SDK Android. Comme vous pouvez le voir, vous utilisez un constructeur pour créer un Spinner avec le mode que vous voulez utiliser.

l'Espérons, 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
répondu Ektos974 2014-06-24 12:35:03

vous pouvez utiliser un spinner et définir la boîte de dialogue spinnerMode, et définir layout_width et layout_height à 0, de sorte que la vue principale ne s'affiche pas, seulement la boîte de dialogue (dropdown view). Appelez performClick dans le bouton cliquer écouter.

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

Modèle:

    <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, c'est que vous pouvez personnaliser votre spinner de toute façon que vous voulez.

Voir ma réponse ici pour personnaliser spinner: substitution de liste déroulante style de Spinner dans la boîte de Dialogue mode

0
répondu live-love 2018-04-12 04:44:07