Кнопка BACK не работает во время работы progressDialog - PullRequest
0 голосов
/ 07 февраля 2011

У меня маленькая проблема;Я надеюсь, что вы можете мне помочь.Во время выполнения progressDialog пользователь нажимает кнопку BACK.Текущий ActivityDalog-переход идет в фоновом режиме, но ProgressDialog выполняется.

Моя проблема заключается в том, что когда пользователь нажимает кнопку НАЗАД, ProgressDialog должен быть на переднем плане Activity, остановить текущий прогресс и спросить «Хотите продолжитьвыход? "

Если пользователь нажимает Продолжить, progressDialog должен продолжить оставшуюся работу.

В противном случае закрыть текущее действие.

КОД ЗДЕСЬ:

public class SampleExample extends Activity {
    static final int PROGRESS_DIALOG = 0;
    Button button;
    TextView download;
    ProgressThread progressThread;
    ProgressDialog progressDialog;


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    download = (TextView) findViewById(R.id.download);
    button = (Button) findViewById(R.id.progressDialog);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

            showDialog(PROGRESS_DIALOG);

        }
    });

}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Handle the back button
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // Ask the user if they want to quit


        new AlertDialog.Builder(this).setIcon(
                android.R.drawable.ic_dialog_alert).setTitle("Exit")
                .setMessage("Are you sure you want to leave?")
                .setNegativeButton(android.R.string.cancel, null)
                .setPositiveButton(android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                // Exit the activity
                                SampleExample.this.finish();
                            }
                        }).show();

        // Say that we've consumed the event

        return true;
    }

    return super.onKeyDown(keyCode, event);
}




protected Dialog onCreateDialog(int id) {

    switch (id) {
    case PROGRESS_DIALOG:
        progressDialog = new ProgressDialog(SampleExample.this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMessage("Loading...");
        download.setText("Now downloading.......");
        progressThread = new ProgressThread(handler);
        progressThread.start();
        progressDialog.setCancelable(true);


        return progressDialog;
    default:
        return null;
    }
}

// Define the Handler that receives messages from the thread and update the
// progress
final Handler handler = new Handler() {
    public void handleMessage(Message msg) {

        int total = msg.getData().getInt("total");
        progressDialog.setProgress(total);

        if (total >= 100) {

            download.setText(" download is completed.");
            dismissDialog(PROGRESS_DIALOG);
            progressThread.setState(ProgressThread.STATE_DONE);
        }
    }
};

/** Nested class that performs progress calculations (counting) */
private class ProgressThread extends Thread {
    Handler mHandler;
    final static int STATE_DONE = 0;
    final static int STATE_RUNNING = 1;
    int mState;
    int total;

    ProgressThread(Handler h) {
        mHandler = h;
    }


    public void run() {
        mState = STATE_RUNNING;
        total = 0;

        while (mState == STATE_RUNNING) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Log.e("ERROR", "Thread Interrupted");

            }
            Message msg = mHandler.obtainMessage();
            Bundle b = new Bundle();
            b.putInt("total", total);
            msg.setData(b);
            mHandler.sendMessage(msg);

            total++;
        }
        Log.d("SampleExample", "6666 run () 6666 End");
    }

    /*
     * sets the current state for the thread, used to stop the thread
     */
    public void setState(int state) {
        mState = state;
    }
}

}

Ответы [ 4 ]

3 голосов
/ 01 ноября 2011

Ну, у меня была такая же проблема.Простейший метод, который сработал для меня, - это использование progressDialog.setCancelable (true). Здесь указывается, можно ли отменить диалог, нажав клавишу «назад».Удачи

3 голосов
/ 21 апреля 2012

Аналогичная проблема, если установлен progressDialog.setCancelable (true), то нажатие кнопки «назад» не выполняет код, записанный в коде кнопки «назад», а просто отменяет диалоговое окно хода выполнения. Повторное нажатие клавиши работает.

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

3 голосов
/ 07 февраля 2011

Вам необходимо переопределить событие кнопки назад. Вы можете сделать это как:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && progressDialog.isShowing()) {
        Log.d(this.getClass().getName(), "back button pressed");//write your own logic here, Whatever you want to do
    }
    return super.onKeyDown(keyCode, event);
}
2 голосов
/ 21 апреля 2012

Вы можете использовать progressDialog.setCancelable(true), а затем progressDialog.setOnCancelListener(), чтобы предоставить OnCancelListener для выполнения кода, который будет выполняться onCancel().

См. Документацию Android по Диалоги .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...