[英]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.