こんにちは、タイトルが示すように、フラグメント内の CursorLoader からデータをロードするときに進行状況ダイアログを実装する方法を知っている人なら誰でも知っています。この点で例が見つかりません。それを行う方法に関するリンクまたはガイドは高く評価されます。ありがとうございました
2 に答える
@Michalのソリューションは、不確定なProgressDialogを表示するのに適していると思うProgressDialog#setIndeterminate(true)
ので、+1を追加しました。このような Fragment に Fragment を追加すること (DialogFragment を追加する SomeFragment ..) が承認されるかどうかはわかりません。似たようなことを提案する前に SO でクロッパーになったからです。さらに、ここで ProgressDialog を使用しても問題ありません。これは、最終的にはフラグメントのコンポーネントであるため、別の Fragment エンティティとして存在する必要なく、フラグメントの下に属します。
この回答を拡張するために、リアルタイムの進捗状況の更新を提供したい場合は、各「作業単位」(CursorLoader
レベルで数えることができる作業の最小分母)の後に、LocalBroadcastManger
(ローカルに保管してください。誰も知る必要はありません)あなたFragment
がリッスンするもの。
Fragment のネストされたBroadcastReceiver#onReceive()
メソッドでイベントを受信すると、Fragment への参照を取得しProgressDialog
、表示された進行状況をインクリメントすることができますincrementProgressBy(diff)
。
ただし、「私は何かをしています」ダイアログをポップアップしたいだけの場合は、使用setIndeterminate(true)
する ProgressDialog を設定するだけで十分です。
最後に、不確定な進行状況ダイアログを 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 にその進行状況を表示したい」と言っていました。onCreate
アクティビティの実装に応じて、書き込みによって不確定な進行状況バーをすぐに表示することを選択できます。
setProgressBarIndeterminateVisibility(true);
ただし、追加のアクションによって CursorLoader が開始される場合、これは単純すぎる可能性があります。この演習全体で注意すべき重要なことは、ActionBar の進行状況ダイアログは、所有するアクティビティの機能であり、基になるフラグメントではないということです。(a) 要求されていない可能性があり、(b) そのようなことを理解することは特権ではないため、INDETERMINATE_PROGRESS 機能が要求されていると仮定して、フラグメントは必要ありません。言い換えれば、自分が書いていることに気付いたら、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
、カーソルの結果がユーザーに表示されます...
フラグメントに 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();
}
};
}