美好的一天,正如标题说,任何人都知道如何实现进度对话框,同时从片段中的CursorLoader加载数据。 无法找到任何有关这方面的例子。 如何做到这一点的任何链接或指导将不胜感激。 谢谢
Answer 1:
我觉得@米哈尔的解决方案将是很好的显示通过一个不确定的ProgressDialog ProgressDialog#setIndeterminate(true)
所以我添加了一个+1。 我不知道添加片段这样的片段(SomeFragment加入DialogFragment ..),因为我已经暗示类似的东西来之前SO上栽跟头被批准。 此外,它的确定,该ProgressDialog这里使用的,因为它最终是所述片段的组分从而所述片段属于下无需存在作为单独的片段的实体。
为了扩展这个答案,如果你想提供一个实时的最新进展,那么我建议每个“工作单位”后(工作的最低分母,您可以在数CursorLoader
级别),你应该通过触发一个事件在LocalBroadcastManger
(保持它的地方,没有人需要知道),你的Fragment
将被监听。
在接收到片段的嵌套在事件BroadcastReceiver#onReceive()
方法可以让你的片段的参考ProgressDialog
并增加与所显示的进度incrementProgressBy(diff)
或类似的。
但是,如果你只是想弹出一个“我做的东西”对话框,然后设置ProgressDialog使用setIndeterminate(true)
就足够了。
最后,你有没有使用添加不确定的进度对话框的动作条的格局考虑? 这是一个很大的核心应用程序是如何运作的,而潜在的CursorLoader
工作。 这将是很好的保持一致。 退房有关项目requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS)
干杯。
更新
为了达到你需要设置好你的父活动(位拥有的动作条)用类似代码的最后方法(我只是从内存中写这!);
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);
在这一点上,你会说:“我想在我的活动动作条是spinny进步的东西”。 现在,这取决于你的活动的执行,你可以选择显示立即在不确定的进度栏onCreate
通过写作;
setProgressBarIndeterminateVisibility(true);
但是,如果一个附加动作导致要启动的CursorLoader这可能是过于简单化了。 什么是重要的在这个练习中要注意的是,在动作条的进度对话框是所属活动的功能,而不是你的潜在的片段。 你不希望你的片段假设INDETERMINATE_PROGRESS功能已被要求自(一)它可能没有和(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。
Similiarly,当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);
}
最后你的活动可以再套不确定的进度条可见假onReceivie
荷兰国际集团这个事件和光标结果显示给用户...
Answer 2:
我认为你可以在你的碎片那里,你可以使用回调方法实现一样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();
}
};
}