Java 刷新片段内的视图
我已经搜索了很多看起来像这样的问题,但是没有找到我的答案 我有一个活动,它有3个选项卡,可以通过操作栏访问。我通过添加3个片段实现了这一点,这些片段膨胀了我扩展视图类时创建的自定义视图 在数据库更改时,我尝试通过调用invalidate()/postinvalidate()刷新选项卡中的视图,但这不起作用。调用片段的onCreateView也是如此,正如我考虑的许多其他选项一样 但是,当我转到另一个选项卡并返回时,已经进行了更改,并且我的视图将按原样更新 如何模拟切换到其他选项卡时发生的相同情况?发生了什么事。我试图查看片段生命周期(尝试调用onCreateView())以了解它,但它只是不想按应有的方式刷新/重画 数据已正确加载,因为当我更改到另一个选项卡时,数据已更改 我删除了一些代码,因为它不再相关。我实现了游标加载程序,而不是我自己的观察者模式来通知更改。这是我现在的主要活动 问题是,如果我想在这些片段中重新绘制视图,我现在应该怎么做。如果我应用fragmentObject.getView().invalidate(),它将不起作用。我遇到了与以前相同的问题,但现在我的观察者通知数据库中的更改是通过加载程序正确实现的Java 刷新片段内的视图,java,android,android-fragments,android-view,android-loadermanager,Java,Android,Android Fragments,Android View,Android Loadermanager,我已经搜索了很多看起来像这样的问题,但是没有找到我的答案 我有一个活动,它有3个选项卡,可以通过操作栏访问。我通过添加3个片段实现了这一点,这些片段膨胀了我扩展视图类时创建的自定义视图 在数据库更改时,我尝试通过调用invalidate()/postinvalidate()刷新选项卡中的视图,但这不起作用。调用片段的onCreateView也是如此,正如我考虑的许多其他选项一样 但是,当我转到另一个选项卡并返回时,已经进行了更改,并且我的视图将按原样更新 如何模拟切换到其他选项卡时发生的相同情况
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) {
}
}
公共类架构活动扩展活动实现LoaderManager.LoaderCallbacks{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar ActionBar=getActionBar();
actionbar.setNavigationMode(actionbar.NAVIGATION\u MODE\u选项卡);
ActionBar.Tab EditTab=ActionBar.newTab().setText(“编辑”);
ActionBar.Tab可视化选项卡=ActionBar.newTab().setText(“可视化”);
ActionBar.Tab AnalyseTab=ActionBar.newTab().setText(“分析”);
Fragment editFragment=新的editFragment();
片段可视化片段=新的可视化片段();
片段analyseFragment=新的analyseFragment();
setTableListener(新的MyTabsListener(editFragment));
VisualizeTab.setTabListener(新的MyTabsListener(visualizeFragment));
AnalyseTab.setTabListener(新的MyTabsListener(analyseFragment));
actionbar.addTab(EditTab);
actionbar.addTab(可视化选项卡);
actionbar.addTab(AnalyseTab);
架构应用程序架构应用程序=(架构应用程序)getApplicationContext();
architectureApplication.initialize();
getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);
}
公共加载器onCreateLoader(int-id,Bundle-args){
如果(id==0){
返回新的游标装入器(this,GraphProvider.NODE_URI,null,null,null);
}else if(id==1){
返回新的游标装入器(this,GraphProvider.ARC_URI,null,null,null);
}
返回null;
}
public void onLoadFinished(加载器,光标){
//重新加载数据实际上是因为当切换到另一个选项卡时,新数据显示良好
Log.e(“数据”,“加载”);
}
公共void onLoaderReset(加载器){
}
}
onCreateView()
。。。这是一种生命周期方法,应该只由框架调用Fragment
s是可重用的UI组件。它们有自己的生命周期,显示自己的视图,并定义自己的行为。您通常不需要让您的活动
干扰片段
的内部工作,因为片段
的行为应该是自包含的,并且独立于任何特定的活动
也就是说,我认为最好的解决方案是让每个片段实现LoaderManager.LoaderCallbacks
接口。每个片段
将初始化一个加载器
(即,如果您使用的是由SQLite数据库支持的内容提供者
,则为加载器
),该加载器将负责(1)在后台线程上加载数据,以及(2)侦听对数据源所做的内容更改,以及在内容发生更改时将新数据传递到onLoadFinished()
此解决方案优于当前解决方案,因为它完全是事件驱动的。当数据传递到onLoadFinished()
时,只需刷新视图(而不是每次单击新选项卡时都必须手动检查数据源是否已更改)
片段的onResume()方法中刷新视图
我找到了一个解决方法来刷新片段中的视图。每次更新数据库时,我都会重新创建(新的CustomView)视图。之后,我调用setContentView(CustomView)。它看起来更像一个黑客,但它是有效的,我尝试过的其他东西都没有 虽然我的问题没有真正解决,但我还是把奖金给了亚历克斯·洛克伍德。他关于加载器的建议使我的应用程序变得更好,并促使我不断寻找最终找到的解决方案。我也遇到了同样的问题。 我的解决方案是分离碎片并重新连接
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;
我有一个类似的(虽然不完全相同)问题,我可以通过以下方式解决:
在我添加的片段中
public void invalidate() {
myView.post(new Runnable() {
@Override
public void run() {
myView.invalidate();
}
});
}
当我想刷新片段的视图myView时,我从活动中调用了这个方法。使用post()可确保视图只有在准备绘制时才失效。最快的解决方案适用于我:
@Override
public void onPause() {
super.onPause();
if (isRemoving() && fragmentView != null) {
((ViewGroup) fragmentView).removeAllViews();
}
}
也许你可以用savedInstanceState做点什么?如果您阅读了Androi附带的数据库教程