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