【发布时间】:2012-09-24 04:40:52
【问题描述】:
我已经搜索了许多看起来像这个问题的问题,但都没有找到我的答案。
我的活动有 3 个可通过操作栏访问的选项卡。我通过添加 3 个片段来扩展我扩展视图类的自定义视图来实现这一点。
在数据库更改的那一刻,我尝试通过调用 invalidate()/postinvalidate() 来刷新选项卡中的视图,但这不起作用。就像我考虑的许多其他选项一样,调用片段的 onCreateView 也是如此。
但是,当我转到另一个选项卡并返回时,已进行更改,并且我的视图已按应有的方式更新。
如何模拟切换到另一个选项卡时发生的相同情况?会发生什么。我试图查看 Fragment 生命周期(试图调用 onCreateView())来弄清楚,但它只是不想按应有的方式刷新/重绘。
数据已正确加载,因为当我切换到另一个选项卡时数据已更改。
我删除了一些代码,因为它不再相关。我实现了 Cursorloaders 而不是我自己的观察者模式来通知更改。这是我现在的主要活动。
问题是,如果我想重绘这些片段中的视图,我现在应该怎么做。如果我应用 fragmentObject.getView().invalidate() 它不起作用。我遇到了和以前一样的问题,但是现在我的 Observer 通知数据库中的更改已通过加载器正确实现。
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) {
}
}
【问题讨论】:
-
也许你可以用 savedInstanceState 做点什么?如果您阅读了随 Android API 提供的数据库教程,您将看到一个部分,如果 savedInstanceState 更改或未更改,则该部分会阻止执行操作。我记不清了。也许您可能会导致 savedInstanceState 被重置,这会导致数据库更新提示视图刷新?只是一个想法。
-
我注意到您没有对
Fragment#getView()进行任何调用... 由getView()返回的视图不是您要操纵的视图吗?也许视图没有被重新绘制的原因是因为您没有更新正确的视图? -
在目前的情况下我不叫这个。我尝试调用 editFragment.getView().invalidate();在观察者中,它被调用但它不起作用。我以其他方式调用了正确的视图,方法是将其作为参数传递给也调用上述 ArchitectureData 类中的 addNode() 方法的方法
标签: java android android-fragments android-view android-loadermanager