Почему намерение запускается перед AlertDialog. Builder.Builder, даже если оно закодировано наоборот

#android #android-activity #android-intent #android-alertdialog

#Android #android-активность #android-намерение #android-alertdialog

Вопрос:

С помощью следующего кода намерение запускается при вызове newPicture, а диалоговое окно отображается после. Что это значит и как я могу изменить порядок?

 public void newPicture(View v) {
    SharedPreferences settings = getPreferences(MODE_PRIVATE);
    boolean geoProtipAlreadyShown = settings.getBoolean("geoProtipAlreadyShown", false);

    if (!geoProtipAlreadyShown) {
        showGeoProtip();

        // and set the option in SharedPreferences
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean("geoProtipAlreadyShown", true);
        editor.commit();
    }

    // start the image capture activity
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(PATH, "tmpfile.jpg")));
    startActivityForResult(intent, IMAGE_CAPTURE);  

}

private void showGeoProtip() {
    String geoProtip = this.getResources().getString(R.string.protip);
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(geoProtip).setCancelable(true).setPositiveButton("OK", null);
    AlertDialog alert = builder.create();
    alert.show();
}
  

Ответ №1:

Переместите действие start image capture в new method и поместите его в OnClickListener диалогового окна:

 builder.setMessage(geoProtip).setCancelable(true).setPositiveButton("OK",
    new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            captureImage();
        }
    });


private void captureImage(){
        // start the image capture activity
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(PATH, "tmpfile.jpg")));
        startActivityForResult(intent, IMAGE_CAPTURE);        
}
  

И измените if-else:

 if (!geoProtipAlreadyShown) {
    showGeoProtip();
    ....
}else{
    captureImage();
}
  

Ответ №2:

Переместите отправку намерения в onclicklistener одной из кнопок диалогового окна.

Ответ №3:

Это классическая ошибка для программистов Android. В принципе, отображение предупреждения не останавливает выполнение кода, поэтому вы должны запустить намерение внутри onclicklistener.

Комментарии:

1. Проблема в том, что предупреждение должно отображаться только один раз (при первом запуске). Итак, как я могу запустить намерение, когда диалоговое окно не отображается? Должен ли я передавать код намерения в отдельный метод и вызывать его как через диалоговое окно, так и в инструкции else?

Ответ №4:

Я думаю, это будет полезно

 Dialog dlg = new AlertDialog.Builder(context)
    .setTitle("TITLE")
    .setMessage("MSG")
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            //Write the intent here.
        }
    })
    .create();
    dlg.show();