#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();