#android
#Android
Вопрос:
Я сохраняю imae из drawing canvas. Для сохранения на SD-карту требуется несколько секунд. Итак, во время процесса сохранения я хочу показать диалоговое окно, в котором изображение сохраняется…
Итак, как реализовать диалоговое окно прогресса для этого?
Код для сохранения изображения такой, как показано ниже:
case R.id.saveBtn:
Toast.makeText(getApplicationContext(), "Save", Toast.LENGTH_SHORT).show();
final Activity currentActivity = this;
Handler saveHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
final AlertDialog alertDialog = new AlertDialog.Builder(currentActivity).create();
alertDialog.setTitle("Drawing App");
alertDialog.setMessage("Your drawing had been saved :)");
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
return;
}
});
alertDialog.show();
}
} ;
new ExportBitmapToFile(this,saveHandler, drawingSurface.getBitmap()).execute();
break;
Ответ №1:
Поскольку вы используете AsyncTask
( ExportBitmapToFile
), вы можете вызвать ProgressDialog
in preExecute()
и отклонить его в postExecute
методе. Для этого не Handler
требуются s.
Редактировать
class ExportBitmapToFile extends AsyncTask<...> {
private ProgressDialog m_progressDialog = null;
....
@Override
protected void onPreExecute(){
m_progressDialog = new ProgressDialog(m_context);
m_progressDialog.setMessage("please wait...");
m_progressDialog.setCancelable(false);
m_progressDialog.show();
}
@Override
protected void onPostExecute(HashMap<String, String> result){
m_progressDialog.dismiss();
//your alert dialog with message to user
AlertDialog.Builder builder = new AlertDialog.Builder(currentActivity);
builder.setTitle("Drawing App");
builder.setMessage("Your drawing had been saved :)");
builder.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
return;
}
});
alertDialog = builder.create()
alertDialog.show();
}
}
Комментарии:
1. Спасибо за ответ. Итак, в моем коде, где я должен запустить диалоговое окно start progress и где его закрыть?
Ответ №2:
Похоже, что ExportBitmapToFile является AsyncTask, и в этом случае вызывается saveHandler.sendEmptyMessage(0);
in onPreExecute()
.
Вы также могли бы вызвать savehandler.sendEmptyMessage(1)
in onPostExecute()
и сделать AlertDialog переменной-членом (а не локальным экземпляром) вашей активности и посмотреть msg.what
в вашей handleMessage(Message msg);
функции — 0 означает показать диалоговое окно, 1 означает, что диалоговое окно должно быть скрыто. Кроме того, вы можете захотеть очистить диалоговое окно в действиях onStop
Вы также хотите установить все свойства в AlertDialog.Конструктор перед вызовом create()
:
private AlertDialog alertDialog = null;
Handler saveHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 0 amp;amp; alertDialog != null) {
AlertDialog.Builder builder = new AlertDialog.Builder(currentActivity);
builder.setTitle("Drawing App");
builder.setMessage("Your drawing had been saved :)");
builder.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
return;
}
});
alertDialog = builder.create()
alertDialog.show();
}
else if(alertDialog != null){
alertDialog.dismiss();
alertDialog = null;
}
}
} ;
Примечание — при этом не отображается индикатор выполнения — вы должны отобразить ProgressDialog при предварительном выполнении, отклонить его, а затем отобразить вышеупомянутый AlertDialog при последующем выполнении (используя ту же технику).
Ответ №3:
Вы должны использовать onPreExecute и onPostExecute в вашем классе ExportBitmapToFile AsyncTask, поэтому вам следует добавить что-то подобное к этому классу.
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(context, "Message",
"Loading");
super.onPreExecute();
}