Как закрыть диалоговое окно Activity

У меня есть тематическая диалоговая активность, которая содержит только ProgressBar с одним TextView. Код этого действия выглядит так:

public class ProgressDialog extends Activity{

TextView msg;
ProgressBar progressBar;

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

    this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.progress_dialog);

    msg = (TextView)findViewById(R.id.progressMsg);
    progressBar = (ProgressBar)findViewById(R.id.progressBar);
    Intent intent = getIntent();
    String msgString = intent.getStringExtra("msg");
    msg.setText(msgString);

}

}

Это представляет собой диалоговое окно ProgressBar, которое я буду использовать для своего проекта, чтобы у меня был одинаковый внешний вид и легко настраиваемое диалоговое окно во всех версиях Android.

Проблема в том, как я могу завершить это действие из метода AsyncTask onPostExecute(), если я запускаю его в методе onPreExecute() как обычное действие. AsyncTask вызывается в другом действии. Я пробовал разные вещи, но не удалось добиться успеха. Я старался:

  • Имитация нажатия кнопки «назад»
  • Использование менеджера фрагментов и менеджера действий
  • Реализация общедоступного метода в Activity, который вызывает метод finish() для Activity

Пожалуйста помоги! Если вам нужен дополнительный код, дайте мне знать!

С наилучшими пожеланиями!


person Aksiom    schedule 13.09.2014    source источник
comment
Finish () не работает для вас в onpostexecute асинхронной задачи?   -  person Illegal Argument    schedule 13.09.2014
comment
Нет. Потому что для этого мне нужен экземпляр запущенной тематической диалоговой активности. И это главная проблема.   -  person Aksiom    schedule 13.09.2014


Ответы (2)


Напишите метод в соответствии с этими строками в вызывающем действии и вызовите его, чтобы удалить диалоговое окно:

private void removeDialog() {
    Intent removeDialogIntent = new Intent(this, ProgressDialogActivity.class).setAction(ACTION_CLOSE_DIALOG);
    startActivity(removeDialogIntent);
}

И в progressDialogActivity обязательно обработайте это:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    if (ACTION_CLOSE_DIALOG.equals(intent.getAction())){
        finish();
    }
}

Вы можете остановить действие из службы или любого другого контекста, просто добавив соответствующие флаги в намерение.

Сказав это, лично я бы использовал DialogFramgent и избегал всего этого беспорядка, зачем вам диалоговая активность...?

person nitzanj    schedule 13.09.2014
comment
Просто чтобы все знали. Это правильный путь, но вы должны установить для параметра launchMode значение SingleTop действия в манифесте. В противном случае он снова откроет диалог с новым намерением. Подробнее см. этот ответ: stackoverflow.com/a/14411650/1425032 - person Aksiom; 14.09.2014

Если вы используете AsyncTask, почему бы вам не запустить ProgressDialog в AsyncTask onPreExecute?

Может быть, вы можете попробовать что-то вроде этого:

private class BackgroundTask extends AsyncTask <Void, Void, Void> {
    private ProgressDialog dialog;

    public RecordAndAlignTask(MyMainActivity activity) {
        dialog = new ProgressDialog(activity);
    }

    @Override
    protected void onPreExecute() {
        dialog.setMessage("Doing something, please wait.");
        dialog.show();
    }

    @Override
    protected void onPostExecute(Void result) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
    }

В качестве альтернативы, если вы хотите показать это в этом действии, возможно, вам следует просто использовать

progressBar.show();

а затем выполните отклонение, когда вы закончите загрузку.

if (dialog.isShowing()) {
            dialog.dismiss();
        }

см. руководство.

person erad    schedule 13.09.2014
comment
Извините, это с ProgressDialog по умолчанию. Я не могу использовать диалог по умолчанию. В любом случае спасибо. - person Aksiom; 13.09.2014