在片段android中的CursorLoader中显示进度对话框

iro*_*xxx 6 android android-fragments android-dialog android-cursorloader

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

Oce*_*ife 4

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

为了扩展这个答案,如果您想提供实时进度更新,那么我建议在每个“工作单元”(您可以在该级别计算的工作的最低分母CursorLoader)之后,您应该通过LocalBroadcastManger(将其保留在本地,其他人不需要知道)您Fragment将要监听的内容。

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

但是,如果您只想弹出一个“我正在做某事”对话框,那么设置要使用的 ProgressDialogsetIndeterminate(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);
Run Code Online (Sandbox Code Playgroud)

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

    setProgressBarIndeterminateVisibility(true);
Run Code Online (Sandbox Code Playgroud)

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

我认为你应该利用一种更加解耦的方法,其中底层片段说,“我已经开始执行加载”,所以在你的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());
       }
Run Code Online (Sandbox Code Playgroud)

您的 Activity 可以监听此事件,然后当它收到该事件时,将不确定进度条可见性设置为 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);
    }
Run Code Online (Sandbox Code Playgroud)

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