我有一个完全正常工作的应用程序,其中包含声明如下的片段:
public class SearchableListFragment extends Fragment implements TabListener
在片段工作期间的某个时刻,我们执行一个相当慢的循环。想象一下:
for(int i = 0;i < large_number;i++)
{
// do complex maths
}
但是这个循环需要相当长的时间,我想在循环期间出现一个进度条。我已经看到了各种添加对话框的例子,但它们似乎都失败了,因为一部分或另一部分似乎不适用于片段....或者它们不适用,因为它们假定一件或另一件根本不适用于我的情况。如何将循环包装在一些显示进度条的代码中(线性条或旋转圆圈 - 最简单的方法)。
编辑:该片段部署在SherlockFragmentActivity
内。片段也通过android.support.v4.app.*
答案 0 :(得分:0)
您可能想看一下这个问题:addView not visible in custom FrameLayout but clickable
特别是它的“解决方案”(http://pastebin.com/2xjnCDLS),它是一个在进度条和内容视图之间切换的视图组,并且可以在layout-xml中轻松使用,在各种场合对我很有帮助。在加载内容/进行计算后,只需调用showProgressbar()和showNext()。
答案 1 :(得分:0)
我有这个ModalProgress类,我用它来显示模态进度,我想你可以按原样使用它:
public class ModalProgress extends DialogFragment {
public static void show(Activity activity, String title,
String message) {
if (activity == null) {
return;
}
FragmentManager fm = activity.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
hideInternal(ft, fm);
// Create and show the dialog.
DialogFragment newFragment = new ModalProgress();
Bundle args = new Bundle();
args.putString("title", title);
args.putString("message", message);
newFragment.setArguments(args);
newFragment.show(ft, "dialog");
}
private static void hideInternal(FragmentTransaction ft, FragmentManager fm) {
Fragment prev = fm.findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
}
public static void hide(FragmentActivity activity) {
if (activity == null) {
return;
}
FragmentManager fm = activity.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
hideInternal(ft, fm);
ft.commit();
}
public ModalProgress() {
setCancelable(false);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle args = getArguments();
ProgressDialog dialog = new ProgressDialog(getActivity());
String title = args.getString("title");
String msg = args.getString("message");
if (!TextUtils.isEmpty(title)) {
dialog.setTitle(title);
}
if (!TextUtils.isEmpty(msg)) {
dialog.setMessage(msg);
}
return dialog;
}
}
现在将循环代码移到AsyncTask中:
private class LongTask extends AsyncTask<Void, Void, Void> {
protected void onPreExecute (){
ModalProgress.show(getActivity(), "Working", "Please wait...");
}
protected Void doInBackground(Void... voids) {
for (int i = 0; i < count; i++) {
// your loop here
}
return null;
}
protected void onPostExecute(Void result) {
ModalProgress.hide(getActivity());
}
}
然后只执行AsyncTask
。