Spinner в AlertDialog. setAdapter()

257
27 апреля 2017, 14:00

Уважаемые знатоки, мне необходимо добавить Spinner со слушателем в AlertDialog. Насколько я понял, для этого необходимо воспользоваться setAdapter, но не понимаю, как это сделать синтаксически.

Есть ли у кого-то пример такого кода?

UPD. ЮрийСПб предложил копипаст ниже, после добавление view.getContext() получилось следующее:

    public void createDialog(View view) {
        LayoutInflater li = LayoutInflater.from(view.getContext());
        View promptsView = li.inflate(R.layout.my_dialog_layout, null);
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getContext());
        alertDialogBuilder.setView(promptsView);
// set dialog message
        alertDialogBuilder.setTitle("My Dialog..");
// create alert dialog
        final AlertDialog alertDialog = alertDialogBuilder.create();
        final Spinner mSpinner = (Spinner) promptsView
                .findViewById(R.id.spinnerFrom);
        String[] s = {"India ", "Arica", "India ", "Arica", "India ", "Arica",
                "India ", "Arica", "India ", "Arica"};
        final ArrayAdapter<String> adp = new ArrayAdapter<String>(view.getContext(),
                android.R.layout.simple_spinner_item, s);
        mSpinner.setAdapter(adp);
        mSpinner.setOnItemSelectedListener(new OnSpinnerItemClicked());
// show it
        alertDialog.show();
        alertDialog.setCanceledOnTouchOutside(false);
    }
    public class OnSpinnerItemClicked implements AdapterView.OnItemSelectedListener {
        @Override
        public void onItemSelected(AdapterView<?> parent,
                                   View view, int pos, long id) {
            Toast.makeText(parent.getContext(), "Clicked : " +
                    parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
        }
        @Override
        public void onNothingSelected(AdapterView parent) {
            // Do nothing.
        }
    }

NPE в строке:

mSpinner.setAdapter(adp);

Стектрейс:

04-26 02:26:38.667 1399-1399/com.xpendence.development.currencyconvarter E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                           Process: com.xpendence.development.currencyconvarter, PID: 1399
                                                                                           java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                                               at android.view.View.performClick(View.java:4780)
                                                                                               at android.view.View$PerformClick.run(View.java:19866)
                                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                               at android.os.Looper.loop(Looper.java:135)
                                                                                               at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                                               at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                                                                                            Caused by: java.lang.reflect.InvocationTargetException
                                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                                               at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                                               at android.view.View.performClick(View.java:4780) 
                                                                                               at android.view.View$PerformClick.run(View.java:19866) 
                                                                                               at android.os.Handler.handleCallback(Handler.java:739) 
                                                                                               at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                               at android.os.Looper.loop(Looper.java:135) 
                                                                                               at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                                               at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                                                                                            Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
                                                                                               at com.xpendence.development.currencyconverter.HomeActivity.createDialog(HomeActivity.java:163)
                                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                                               at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                                                                                               at android.view.View.performClick(View.java:4780) 
                                                                                               at android.view.View$PerformClick.run(View.java:19866) 
                                                                                               at android.os.Handler.handleCallback(Handler.java:739) 
                                                                                               at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                               at android.os.Looper.loop(Looper.java:135) 
                                                                                               at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                                               at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Дело, похоже, в Context. А именно, в строке

final ArrayAdapter<String> adp = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, s);
Answer 1

Копипаст с en-SO

LayoutInflater li = LayoutInflater.from(context);
View promptsView = li.inflate(R.layout.my_dialog_layout, null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setView(promptsView);
// set dialog message
alertDialogBuilder.setTitle("My Dialog..");
alertDialogBuilder.setIcon(R.drawable.ic_launcher);
// create alert dialog
final AlertDialog alertDialog = alertDialogBuilder.create();
final Spinner mSpinner= (Spinner) promptsView
        .findViewById(R.id.mySpinner);
String[] s = { "India ", "Arica", "India ", "Arica", "India ", "Arica",
    "India ", "Arica", "India ", "Arica" };
final ArrayAdapter<String> adp = new ArrayAdapter<String>(context,
        android.R.layout.simple_spinner_item, s);
mSpinner.setAdapter(adp);
mSpinner.setOnItemSelectedListener(new OnSpinnerItemClicked());
// show it
alertDialog.show();
alertDialog.setCanceledOnTouchOutside(false);

Слушатель нажатий

public class OnSpinnerItemClicked implements OnItemSelectedListener {
    @Override
    public void onItemSelected(AdapterView<?> parent,
            View view, int pos, long id) {
        Toast.makeText(parent.getContext(), "Clicked : " +
                parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
    }
    @Override
    public void onNothingSelected(AdapterView parent) {
        // Do nothing.
    }
}
READ ALSO
Отправка смс с кодом при авторизации

Отправка смс с кодом при авторизации

ЗдравствуйтеДело в том, что я хочу реализовать авторизацию в своем приложении как на Whatsapp

182
Проблема утечки данных в Lock механизме

Проблема утечки данных в Lock механизме

Есть реализация Lock механизма на wait и notify:

292
есть ли максимальный размер у массивов в java?

есть ли максимальный размер у массивов в java?

Есть массив byte[]Чем ограничивается его максимальный размер? Влияет ли на это размер стека Xss для JVM?

239