6

美好的一天,正如标题所说,任何人都知道如何在从片段中的 CursorLoader 加载数据时实现进度对话框。在这方面找不到任何例子。任何有关如何操作的链接或指南都将受到高度赞赏。谢谢

4

2 回答 2

4

我认为@Michal 的解决方案非常适合通过显示不确定的 ProgressDialog,ProgressDialog#setIndeterminate(true)因此我添加了 +1。我不确定向这样的片段添加片段(SomeFragment 添加 DialogFragment ..)是否被批准,因为在提出类似建议之前我已经对 SO 进行了裁剪。另外,在这里使用 ProgressDialog 是可以的,因为最终它是片段的一个组件,因此属于片段之下,而无需作为单独的片段实体存在。

要扩展此答案,如果您想提供实时进度更新,那么我建议在每个“工作单元”(您可以在该CursorLoader级别计算的最低工作分母)之后,您应该通过触发事件LocalBroadcastManger(保持在本地,没有其他人需要知道)你Fragment会听哪个。

在 Fragment 的嵌套BroadcastReceiver#onReceive()方法下接收事件时,可以获得对您的 Fragment 的引用,并以或类似的方式ProgressDialog增加显示的进度。incrementProgressBy(diff)

但是,如果您只想弹出一个“我正在做某事”对话框,那么设置 ProgressDialog 使用setIndeterminate(true)就足够了。

最后,您是否考虑过使用将不确定进度对话框添加到 ActionBar 的模式?这就是许多核心应用程序在底层CursorLoader工作时的运行方式。保持一致会很好。查看与 相关的项目requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS)

干杯。

更新

要实现最后一种方法,您需要使用类似的代码设置您的父活动(拥有 ActionBar 的位)(我只是从内存中编写这个!);

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Note that this is requested before you have called setContentView...
    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.yourLayout);

此时您已经说过,“我希望在我的 Activity ActionBar 中有那个旋转的进度”。现在,根据您的活动实施,您可以选择onCreate通过书写立即显示不确定的进度条;

    setProgressBarIndeterminateVisibility(true);

但是如果一个额外的动作导致 CursorLoader 被启动,这可能太简单了。在整个练习中需要注意的重要一点是,ActionBar 中的进度对话框是拥有 Activity 的功能,而不是您的底层 Fragment。您不希望您的片段假设已请求 INDETERMINATE_PROGRESS 功能,因为(a)它可能没有,并且(b)理解这些事情不是特权。换句话说,如果您发现自己在写作,请getActivity().setProgressBarIndeterminateVisibility(true)停下来思考。

我认为您应该利用一种更加解耦的方法,其中底层 Fragments 说“我已经开始执行加载”,所以在您的CursorLoader回调中,onCreateLoader例如;

       @Override
       public Loader<Result> onCreateLoader(int id, Bundle b) {
        // Fire event saying this load is starting.
        final Intent loadStarted = new Intent();
        loadStarted.setAction(YourFragment.LOAD_STARTED);
        return new SomeCursorLoader(this.getActivity());
       }

您的活动可以侦听此事件,然后当它接收到它时,将不确定的进度条可见性设置为 true。

类似地,当CursorLoader调用回调时,onLoaderFinished会触发另一个事件,例如;

    @Override
    public void onLoadFinished(Loader<Result> loader, Result data) {
     // Fire event saying this load is finished.
     final Intent loadFinished = new Intent();
     loadFinished.setAction(YourFragment.LOAD_FINISHED);
    }

最后,您的活动可以将不确定的进度条可见性设置为 falseonReceivie此事件,并将光标结果显示给用户......

于 2012-08-03T11:00:18.433 回答
0

我认为您可以在 Fragment 中实现 LoaderCallback,您可以使用回调方法onCreateLoader,例如显示对话框和onLoadFinished关闭对话框。看下面的代码:

public class SomeFragment extends Fragment implements LoaderCallbacks<Result> {
     private DialogFragment dialog;

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         //you should implement yours DialogFragment
         dialog = new DialogFragment();
         //Start loader
         getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Loader<Result> onCreateLoader(int id, Bundle b) {
         //Show dialog 
         dialog.show(getFragmentManager(), "TAG");
         return new SomeCursorLoader(this.getActivity());
    }

    @Override
    public void onLoadFinished(Loader<Result> loader, Result data) {
        handler.sendEmptyMessage(0);            
    }

    @Override
    public void onLoaderReset(Loader<Result> arg0) {
    }

    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            dialog.dismiss();
        }
    };
}
于 2012-08-03T10:14:19.510 回答