Диалог оповещения с оператором if получил ошибку «просочилось окно DecorView, которое было изначально добавлено здесь» - PullRequest
0 голосов
/ 22 октября 2019

Я пытался показать alertdialog в некоторых условиях (в кодах это MyIfStatement).

Я сделал MyDialog в onCreate и пытался показать onClick при нажатии кнопки подтверждения в определенномусловие.

Я получил ошибку с именем has leaked window DecorView that was originally added here.

Я обнаружил, что мы должны закрыть диалоговое окно до окончания действия.

Не могли бы вы сказать мне, в чем заключается проблема моегокоды?

Мой код указан ниже.

public class BaseWidgetConfigureActivity extends AppCompatActivity
        implements View.OnClickListener, SeekBar.OnSeekBarChangeListener{
    private static final String TAG = BaseWidgetConfigureActivity.class.getSimpleName();

    AlertDialog MyDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ConfirmButton = findViewById(R.id.widget_confirm_button);
        CancelButton = findViewById(R.id.widget_cancel_button);

        ConfirmButton.setOnClickListener(this);
        CancelButton.setOnClickListener(this);

        MyDialog = new AlertDialog.Builder(BaseWidgetConfigureActivity.this)
                .setMessage("My message.")
                .setPositiveButton("Edit", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                        startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        finish();
                    }
                })
                .create();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    public void onClick(View view) {
        switch (view.getId()){
            case R.id.confirm_button:
                if (MyIfStatement){
                    MyDialog.show();
                }
                break;
            case R.id.cancel_button:
                finish();
                break;
            default:
                finish();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
    }
}

В положительной кнопке onClick, я попытался

1)

onStop();
dialog.dismiss();
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
finish();

2)

onPause();
dialog.dismiss();
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
finish();

3)

dialog.dismiss();
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
finish();

В отрицательной кнопке onClick, я пытался

1)

dialog.cancel();
finish();

2)

dialog.cancel();

и т. Д.

Ответы [ 3 ]

0 голосов
/ 22 октября 2019

Попробуйте,

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Write your Message Here....");
builder.setCancelable(true);

builder.setPositiveButton(
    "Yes",
    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            dialog.cancel();
        }
    });

builder.setNegativeButton(
    "No",
    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            dialog.cancel();
        }
    });

AlertDialog alert = builder.create();
alert.show();
0 голосов
/ 22 октября 2019

Я думаю, что вы предоставляете приложение или контекст деятельности, где уничтожение диалога будет иметь проблемы. Создайте класс singleton / Custom для обработки контекста диалога.

Обрабатывать контекст, если он не равен нулю, и затем инициализировать диалоговое окно оповещения, в противном случае вернуть поток.

0 голосов
/ 22 октября 2019

Используйте этот код

public class BaseWidgetConfigureActivity extends AppCompatActivity
        implements View.OnClickListener, SeekBar.OnSeekBarChangeListener {

    private static final String TAG = BaseWidgetConfigureActivity.class.getSimpleName();
    AlertDialog MyDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ConfirmButton = findViewById(R.id.widget_confirm_button);
        CancelButton = findViewById(R.id.widget_cancel_button);

        ConfirmButton.setOnClickListener(this);
        CancelButton.setOnClickListener(this);

        MyDialog = new AlertDialog.Builder(BaseWidgetConfigureActivity.this)
                .setMessage("My message.")
                .setPositiveButton("Edit", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss(); //1.
                        startActivity(new
                                Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        finish();
                    }
                })
                .create();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    public void onClick(View view) {
        switch (view.getId()){
            case R.id.confirm_button:
                if (MyIfStatement){
                    MyDialog.show();
                }
                break;
            case R.id.cancel_button:
                dialog.dismiss();//2.
                finish();
                break;
            default:
                dialog.dismiss();//3.
                finish();
        }
    }

    @Override
    public void onPause() {
        dialog.dismiss(); //4.
        super.onPause();
    }
 }

. Вы должны закрыть диалоговое окно до того, как все завершится или будет выполнено.

...