【问题标题】:Showing a progressbar from within a fragemnet从一个fragemnet中显示一个进度条
【发布时间】:2013-10-07 22:42:29
【问题描述】:

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

public class SearchableListFragment extends Fragment implements TabListener

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

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

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

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

【问题讨论】:

  • 您可以对定义了进度条的 XML 进行膨胀,或者使用标准文档化的进度条类? (我对后者也有问题,第一种方法每次都有效)
  • 膨胀 xml 听起来比需要做的工作更多......采用标准外观很好。但据我所知,“标准记录的进度条”不想在片段中工作。
  • 什么“在片段中不起作用”?可能会有很多问题!你必须更具体。
  • 你真的需要具体,因为我认为 ProgressDialog 应该根据你的需要工作。
  • 你试过ProgressDialog.show(getActivity(),"HI", "Loading"); 吗? show() 方法只需要 Context 作为第一个参数。

标签: android


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我有这个 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多