0

我有一个完整的应用程序,其中包含一个声明如下的片段:

public class SearchableListFragment extends Fragment implements TabListener

在片段工作期间的某一时刻,我们执行了一个相当慢的循环。想象一下:

for(int i = 0;i < large_number;i++)
{
    // do complex maths
}

但是这个循环需要相当长的时间,我希望在循环期间出现一个进度条。我见过各种添加对话框的例子,但它们似乎都失败了,因为一个或另一个部分似乎不适用于片段......或者它们不适用,因为它们假设一件事或另一件事根本不适用于我的情况。如何将循环包装在一些将显示进度条的代码中(线性条或旋转圆圈 - 最简单的)。

编辑:片段部署在SherlockFragmentActivity. 片段也正在通过android.support.v4.app.*

4

2 回答 2

0

您可能想看看这个问题:addView not visible in custom FrameLayout but clickable

尤其是它的“解决方案”(http://pastebin.com/2xjnCDLS),它是一个在进度条和内容视图之间切换的视图组,并且很容易在您的 layout-xml 中使用,对我来说非常有帮助场合。只需在加载内容/进行计算之后调用 showProgressbar() 和 showNext() 即可。

于 2013-10-07T14:12:34.767 回答
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.

于 2013-10-07T14:15:03.950 回答