Не работает Spinner в диалоговом окне в spinnerMode="dialog"

1 - диалоговое окно, 2 - spinner в режиме dropdown, 3 - spinner в режиме 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" при повороте устройства, приложение продолжало нормално работать?


Ответы (0 шт):