このような多くの質問を検索しましたが、どれにも答えが見つかりませんでした。
アクション バーからアクセスできる 3 つのタブがあるアクティビティがあります。これは、ビュー クラスを拡張して作成したカスタム ビューを拡張する 3 つのフラグメントを追加することで実現しました。
データベースが変更された時点で、invalidate()/postinvalidate() を呼び出してタブのビューを更新しようとしましたが、うまくいきません。私が検討した他の多くのオプションと同じように、フラグメントの onCreateView を呼び出す場合も同じことが言えます。
ただし、別のタブに移動して戻ると、変更が行われており、ビューが更新されているはずです。
別のタブに変更したときに発生するのと同じことをシミュレートするにはどうすればよいですか? 何が起こるか。Fragment のライフサイクルを調べてみました (onCreateView() を呼び出そうとしました)。
別のタブに切り替えるとデータが変更されるため、データは適切に読み込まれます。
関係がなくなったので、コードの一部を削除しました。変更を通知するために、独自の Observer パターンの代わりに Cursorloaders を実装しました。これが今の私の主な活動です。
問題は、これらのフラグメント内のビューを再描画したい場合、今何をすべきかです。fragmentObject.getView().invalidate() を適用すると機能しません。以前と同じ問題を抱えていますが、データベースの変更を通知するオブザーバーがローダーで適切に実装されました。
public class ArchitectureActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionbar = getActionBar();
actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab EditTab = actionbar.newTab().setText("Edit");
ActionBar.Tab VisualizeTab = actionbar.newTab().setText("Visualize");
ActionBar.Tab AnalyseTab = actionbar.newTab().setText("Analyse");
Fragment editFragment = new EditFragment();
Fragment visualizeFragment = new VisualizeFragment();
Fragment analyseFragment = new AnalyseFragment();
EditTab.setTabListener(new MyTabsListener(editFragment));
VisualizeTab.setTabListener(new MyTabsListener(visualizeFragment));
AnalyseTab.setTabListener(new MyTabsListener(analyseFragment));
actionbar.addTab(EditTab);
actionbar.addTab(VisualizeTab);
actionbar.addTab(AnalyseTab);
ArchitectureApplication architectureApplication = (ArchitectureApplication)getApplicationContext();
architectureApplication.initialize();
getLoaderManager().initLoader(0, null, this);
getLoaderManager().initLoader(1, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if (id == 0){
return new CursorLoader(this, GraphProvider.NODE_URI , null, null, null, null);
} else if (id == 1){
return new CursorLoader(this, GraphProvider.ARC_URI , null, null, null, null);
}
return null;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// Reloading of data, actually happens because when switching to another tab the new data shows up fine
Log.e("Data", "loaded");
}
public void onLoaderReset(Loader<Cursor> loader) {
}
}