web-dev-qa-db-ja.com

Android Spinnerをポップアップとして作成するにはどうすればよいですか?

ユーザーが項目を選択できるようにするために、ユーザーがメニュー項目をタップしたときにスピナーダイアログを表示したい。

これには別のダイアログが必要ですか、それともSpinnerを直接使用できますか? このリンク、 はMODE_DIALOGオプションについて言及していますが、もう定義されていないようです。 AlertDialogは問題ないかもしれませんが、すべてのオプションで「リスト内の項目をクリックしてもダイアログが消えない」と表示されます。なにか提案を?

理想的には、コードはスピナーが画面に表示される場合に似ています。

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

警告ダイアログを使用できます

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

あなたが望むようにそれらの1つが押されたとき、これはダイアログを閉じます。お役に立てれば!

107
schwiz

xmlにはオプションがあります

Android:spinnerMode="dialog"

これをダイアログモードに使用します

83
user2582324

これを試してください:

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

詳細については、こちらをご覧ください link .

17
haotang

MODE_DIALOGおよびMODE_DROPDOWNは、API 11(ハニカム)で定義されています。 MODE_DIALOGは、以前のプラットフォームバージョンでの通常の動作を説明しています。

10
adamp

Android:spinnerMode="dialog"として小さな属性を追加すると、スピナーの内容がポップアップで表示されます。

9
San

独自のカスタムダイアログを作成できます。とても簡単です。スピナーで選択して消す場合は、OnItemClickListenerを追加して追加します

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

[OK]ボタンのOnClickListenerのように。ただし、警告が1つあります。デフォルトオプションを再選択すると、onclickリスナーは起動しません。 [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
  }
});
6
Aleadam

これは、performClick()をオーバーライドしてドロップダウンではなくダイアログを表示するSpinnerサブクラスです。 XMLは不要です。それを試してみてください、それがあなたのために働くかどうか知らせてください。

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

詳細については、この記事をお読みください: 作成方法Androidダイアログのスピナーオプションポップアップ

2
Roger Keays

スピナーを使用してspinnerModeをdialogに設定し、layout_widthとlayout_heightを0に設定すると、メインビューには表示されず、ダイアログ(ドロップダウンビュー)のみが表示されます。ボタンクリックリスナーでperformClickを呼び出します。

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

レイアウト:

    <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"/>

この利点は、スピナーを自由にカスタマイズできることです。

スピナーをカスタマイズするには、私の回答を参照してください: ダイアログモードでのスピナーのドロップダウンリストスタイルのオーバーライド

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

フルスクリーンのポップアップとして表示したい場合は、xmlレイアウトも必要ありません。 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

これはAndroid SDKソースコードから。

それがあなたを助けることを願っています:)

 /**
     * 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