是否有首选方式在Android中显示“加载”动画?目前我正在为长时间运行的进程显示带有“正在加载...”文本的Dialog。让.gif为此工作很棘手,所以我想知道这是否是之前已经解决的问题,如果是的话,怎么样?
答案 0 :(得分:3)
在我的应用中,我通常使用ProgressDialog
来显示旋转的“正在加载...”消息。有更高级/更漂亮的方式,但这是一个快速简便的内置解决方案。
ProgressDialog progressDialog = ProgressDialog.show(Activity.this, "",
"Loading...");
......做一些工作......
progressDialog.dismiss();
progressDialog = null;
如果你有一个静态的Utilities类来生成Alerts和Dialogs之类的东西,这里有两个不错的补充:
public static ProgressDialog createProgressDialog(Context context, String title, String message, boolean isCancelable)
{
ProgressDialog dialog = new ProgressDialog(context);
dialog.setTitle(title);
dialog.setMessage(message);
dialog.setCancelable(isCancelable);
return dialog;
}
如果您正在使用AsyncTask
s在后台完成工作,那么检查Activity
是否仍然“活着”并且在您展示和解除{{{ 1}},或者您的应用程序会因奇怪的异常而死亡(请参阅this answer)。
ProgressDialog
同样取消对话:
public static void safeShowProgressDialog(Context context, ProgressDialog dialog)
{
if(!((Activity) context).isFinishing())
{
dialog.show();
}
}
请参阅API参考:
http://developer.android.com/reference/android/app/ProgressDialog.html
答案 1 :(得分:1)
这是一个很好的例子:
假设您尝试登录并等待来自服务器的响应。在等待时,您将显示进度对话框,并在成功切换登录活动到主要:
private ProgressDialog dialog;
...
dialog = ProgressDialog.show(FirstLoginActivity.this, "", "Connecting. Please wait...", true);
HeavyTask task = new HeavyTask();
task.execute(str1, str2);
private class HeavyTask extends AsyncTask<String, Void, Void> {
private String str1= "";
private String str2= "";
protected Void doInBackground(String... args) {
str1= args[0];
str2= args[1];
try {
doSomething(str1, str2);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void results) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
doStuff(str1, str2);
}
}, 500);
}
private void doStuff(String str1, String str2) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent().setClass(FirstLoginActivity.this, OtherActivity.class).setData(getIntent().getData()));
Toast.makeText(getApplicationContext(), "Registration succeeded.", Toast.LENGTH_LONG).show();
//kill the dialog waiting
dialog.dismiss();
dialog = null;
}
}, 1000);
}
答案 2 :(得分:0)
您可以在Android设计文档中找到一些指导:http://developer.android.com/design/building-blocks/progress.html
答案 3 :(得分:0)
您可以使用进度条。我通常通过asyctasks使用它。并将以下方法重载为:
protected void onProgressUpdate(Integer... progress) {
((ProgressBar) findViewById(R.id.progressBar1)).setProgress(progress[0]);
}
答案 4 :(得分:0)
根据您的应用程序设计,它会有所不同,但ProgressDialog
是一种相当常见的解决方案。这个tutorial会向您展示如何将它们捆绑在一起以及两种变体(有或没有显示进度)。