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

时间:2012-08-03 09:41:00

标签: android android-fragments android-dialog android-cursorloader

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

2 个答案:

答案 0 :(得分:4)

我认为@Michal的解决方案可以通过ProgressDialog#setIndeterminate(true)显示不确定的ProgressDialog,所以我添加了+1。我不确定像这样在片段中添加片段(SomeFragment添加DialogFragment ..)被批准,因为我在提出类似的东西之前就已经成为了一个裁剪器。此外,在这里使用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中的spinny进展”。现在,根据您的活动实施情况,您可以选择立即在onCreate中通过撰写来显示不确定的进度条;

    setProgressBarIndeterminateVisibility(true);

但如果额外的操作导致CursorLoader启动,这可能过于简单了。整个练习中需要注意的是,ActionBar中的进度对话框是拥有活动的一个特征,而不是您的底层片段。你不希望你的片段假设已经请求了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());
       }

您的活动可以监听此活动,然后在收到活动时,将不确定的进度条可见性设置为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);
    }

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

答案 1 :(得分: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();
        }
    };
}