Не работает Spinner в диалоговом окне в spinnerMode="dialog"
Есть активити и в нем диалоговое окно со спиннером (рис. 1)
Если вызвать список спиннера в режиме dropdown (рис. 2), то он нормально работает.
Но, если вызвать список спиннера в spinnerMode="dialog" (рис. 3), и повернуть устройство, то приложение падает со следующей ошибкой:
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.IllegalArgumentException: View not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:385) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:287) at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:79) at android.app.Dialog.dismissDialog(Dialog.java:323) at android.app.Dialog.dismiss(Dialog.java:306) at android.widget.Spinner$DialogPopup.dismiss(Spinner.java:840) at android.widget.Spinner.onDetachedFromWindow(Spinner.java:414) at android.support.v7.widget.AppCompatSpinner.onDetachedFromWindow(AppCompatSpinner.java:404) at android.view.View.dispatchDetachedFromWindow(View.java:12023) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2612) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2610) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2610) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2610) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2610) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2610) at android.view.ViewRootImpl.dispatchDetachedFromWindow(ViewRootImpl.java:2956) at android.view.ViewRootImpl.doDie(ViewRootImpl.java:4542) at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3325) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:153) at android.app.ActivityThread.main(ActivityThread.java:5299) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) at dalvik.system.NativeStart.main(Native Method)
Это код активити из которого вызывается диалог со спиннером:
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
public class CreatePlanActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_plan);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onSupportNavigateUp(){
finish();
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
switch (id){
case R.id.menu_add:
showCreatePlanDialog(); //Вызов диалога создания комплекса упражнений
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void showCreatePlanDialog() {
//Показать диалог
DialogFragment dialogCreatePlan = new DialogCreatePlan();
dialogCreatePlan.show(getSupportFragmentManager(), "dialogCreatePlan");
}
}
Код диалогового окна:
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class DialogCreatePlan extends DialogFragment {
private CreatePlanActivity createPlanActivity;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//Получаем контекст
createPlanActivity = (CreatePlanActivity)getActivity();
getDialog().setTitle("Добавить упражнение");
View view = inflater.inflate(R.layout.dialog_create_plan, null);
Spinner spinner = view.findViewById(R.id.spinner_plan);
EditText et1 = view.findViewById(R.id.et1);
EditText et2 = view.findViewById(R.id.et2);
Button btn_Cancel_DialogCreatePlan = view.findViewById(R.id.btn_cancel_create_plan);
Button btn_OK_DialogCreatePlan = view.findViewById(R.id.btn_ok_create_plan);
DBHelper dbHelper = new DBHelper(getContext());
ArrayList<ExerciseModel> data =dbHelper.getDataFromDB();
ArrayList<String> list = new ArrayList<>();
for (int i=0 ; i<data.size(); i++){
ExerciseModel em = data.get(i);
String id = em.getId();
String content = em.getContent();
list.add(content);
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(createPlanActivity, android.R.layout.simple_list_item_1, list);
spinner.setAdapter(adapter);
btn_Cancel_DialogCreatePlan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getDialog().cancel();
}
});
btn_OK_DialogCreatePlan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Нажатие кнопки "ОК"
}
});
return view;
}
}
Заметил, что такого не возникает на виртуальном устройстве с API 28. Но я тестирую на API 17 на реальном устройстве и тут такая ошибка имеет место быть.
Пока единственное решение приходит на ум - это попробовать использовать костыль в виде запрета поворота activity в файле манифеста, но так не хочется поступать.
Как сделать так, что бы в spinnerMode="dialog" при повороте устройства, приложение продолжало нормално работать?
