繁体   English   中英

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

[英]show Progress Dialog within a CursorLoader in a fragment android

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

我认为ProgressDialog#setIndeterminate(true)的解决方案很适合通过ProgressDialog#setIndeterminate(true)显示不确定的ProgressDialog,所以我添加了+1。 我不确定像这样在片段中添加片段(SomeFragment添加DialogFragment ..)被批准,因为我在提出类似的东西之前就已经成为了一个裁剪器。 此外,在这里使用ProgressDialog是可以的,因为最终它是片段的一个组件,因此属于片段,而不需要作为单独的片段实体存在。

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

在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中的进度对话框是拥有活动的一个特征,而不是底层的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());
       }

您的活动可以监听此事件,然后在收到该事件时,将不确定的进度条可见性设置为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 this event并将光标结果显示给用户...

我认为您可以在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();
        }
    };
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM