刷新片段内的视图

我已经search了很多像这样的问题,但还没有find我的答案。

我有一个活动,有3个标签可通过操作栏访问。 我通过添加3个片段来扩展视图类,从而实现了这一点。

在数据库更改的那一刻,我尝试通过调用invalidate()/ postinvalidate()来刷新我的选项卡中的视图,但这不起作用。 调用片段的CreateCreateView也是一样的,就像我考虑的许多其他选项一样。

当我去到另一个标签然后返回,但是,更改已经完成,我的观点被更新,因为它应该是。

如何模拟在切换到另一个选项卡时发生的相同情况? 发生了什么事。 我试图看看片段生命周期(试图调用onCreateView())来弄清楚,但它只是不想刷新/重绘,因为它应该。

数据正确加载,因为当我切换到另一个选项卡时数据发生了变化。

我删除了一些代码,因为它不再相关。 我实现了Cursorloaders而不是我自己的Observer模式来通知一个改变。 这是我现在的主要活动。

现在的问题是如果我想重新绘制这些片段中的视图,我现在应该做什么。 如果我应用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) { } } 

Solutions Collecting From Web of "刷新片段内的视图"

  1. 不要试图自己调用onCreateView() …这是一个生命周期方法,只能由框架调用。

  2. Fragment s是可重用的UI组件。 他们有自己的生命周期,展示自己的观点,并定义自己的行为。 你通常不需要让自己的Activity混乱在Fragment的内部工作,因为Fragment的行为应该是独立的,独立于任何特定的Activity

    也就是说,我认为最好的解决scheme是让每个Fragment实现LoaderManager.LoaderCallbacks<D>接口。 每一个Fragment都会初始化一个Loader (如果你使用的是一个由SQLite数据库支持的ContentProvider则是一个CursorLoader ),并且Loader将负责(1)在后台线程上加载数据,(2)监听内容变化对数据源进行处理,并在发生内容更改时向onLoadFinished()传递新数据。

    这个解决scheme比当前的解决scheme更好,因为它完全是事件驱动的。 数据发送到onLoadFinished()时,您只需刷新视图(而不必手动检查每次单击新选项卡时数据源是否已更改)。

  3. 如果你懒惰,只想要一个快速的解决scheme,你也许能够在你的FragmentonResume()方法中刷新视图。

我有一个类似的(虽然不是相同的)问题,我可以通过以下方式解决:

在我添加的片段

 public void invalidate() { myView.post(new Runnable() { @Override public void run() { myView.invalidate(); } }); } 

当我想刷新片段的视图myView时,我从活动中调用了这个方法。 使用post()可以确保视图只有在准备好绘制时才会失效。

我find了解决方法来刷新我的片段内的视图。 每次数据库更新时,我都重新创build(新的CustomView)视图。 之后,我调用setContentView(CustomView视图)。 它看起来更像一个黑客,但它的工作,没有别的,我试过。

虽然我的问题没有得到解决,但是我给了Alex Lockwood奖励。 他对装载机的build议使得我的应用程序更好,并且使我不断寻找我最终find的解决scheme。

我遇到过同样的问题。 我的解决scheme是分离片段并重新附加。

  FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment f = getFragment(action); if(forceUpdate) { fragmentTransaction.detach(f); fragmentTransaction.attach(f); } fragmentTransaction.replace(R.id.mainFragment, f); fragmentTransaction.commit(); currentAction = action; 

最快的解决scheme为我工作:

  @Override public void onPause() { super.onPause(); if (isRemoving() && fragmentView != null) { ((ViewGroup) fragmentView).removeAllViews(); } }