Ошибка при создании пользовательского диалога

Я пытаюсь создать пользовательское диалоговое окно с двумя счетчиками (spinner_month и spinner_year).

В качестве ориентира я взял пример из руководства Google для разработчиков.

Код основной активности:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(R.layout.calender_view);
AlertDialog alertDialog = builder.create();
Spinner spinner = (Spinner) alertDialog.findViewById(R.id.spinner_month);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.months_array,     android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

Мой calender_view.xml выглядит следующим образом

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          android:id="@+id/layout_category"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:orientation="horizontal"
          android:padding="5dp">

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/spinner_year"
        android:layout_weight="1"/>

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/spinner_month"
        android:layout_weight="1"
        android:spinnerMode="dialog"/>
</LinearLayout>

Когда я запускаю его, я получаю следующую ошибку:

Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter) для нулевой ссылки на объект

Это потому, что объект "spinner" равен null, но я не уверен, почему. Есть ли что-то, что мне не хватает?


person Vivek    schedule 02.02.2017    source источник


Ответы (1)


Попробуй это

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    LayoutInflater li = LayoutInflater.from(this);
    View view = li.inflate(R.layout.calender_view, null, false);
    builder.setView(view);
    AlertDialog alertDialog = builder.create();

    Spinner spinner = (Spinner) view.findViewById(R.id.spinner_month);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.months_array,     android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
person Salauddin Gazi    schedule 02.02.2017
comment
Этот ответ - весь код. Пожалуйста, рассмотрите возможность добавления некоторых описаний того, почему этот ответ решает проблему. - person RedBassett; 02.02.2017
comment
согласно предложению - я добавил LayoutInflater, а затем раздул calender_view и назначил то же самое адаптеру. Это сработало отлично! - person Vivek; 02.02.2017
comment
когда я вызываю builder.show в первый раз, он работает нормально. но последующие вызовы терпят неудачу с java.lang.IllegalStateException: The specified child already has a parent, так что мое предположение верно, что мне нужно создавать диалог каждый раз, когда мне это нужно, а не то, что я могу создать во время onCreate(), и просто вызвать builder.show(), что я считаю более эффективным - person Vivek; 02.02.2017
comment
Создавайте диалог каждый раз, когда вам нужно - person Salauddin Gazi; 02.02.2017