显示片段内的进度条

时间:2013-10-07 14:05:43

标签: android

我有一个完全正常工作的应用程序,其中包含声明如下的片段:

public class SearchableListFragment extends Fragment implements TabListener

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

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

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

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

实现

2 个答案:

答案 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