Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 刷新片段内的视图_Java_Android_Android Fragments_Android View_Android Loadermanager - Fatal编程技术网

Java 刷新片段内的视图

Java 刷新片段内的视图,java,android,android-fragments,android-view,android-loadermanager,Java,Android,Android Fragments,Android View,Android Loadermanager,我已经搜索了很多看起来像这样的问题,但是没有找到我的答案 我有一个活动,它有3个选项卡,可以通过操作栏访问。我通过添加3个片段实现了这一点,这些片段膨胀了我扩展视图类时创建的自定义视图 在数据库更改时,我尝试通过调用invalidate()/postinvalidate()刷新选项卡中的视图,但这不起作用。调用片段的onCreateView也是如此,正如我考虑的许多其他选项一样 但是,当我转到另一个选项卡并返回时,已经进行了更改,并且我的视图将按原样更新 如何模拟切换到其他选项卡时发生的相同情况

我已经搜索了很多看起来像这样的问题,但是没有找到我的答案

我有一个活动,它有3个选项卡,可以通过操作栏访问。我通过添加3个片段实现了这一点,这些片段膨胀了我扩展视图类时创建的自定义视图

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

但是,当我转到另一个选项卡并返回时,已经进行了更改,并且我的视图将按原样更新

如何模拟切换到其他选项卡时发生的相同情况?发生了什么事。我试图查看片段生命周期(尝试调用onCreateView())以了解它,但它只是不想按应有的方式刷新/重画

数据已正确加载,因为当我更改到另一个选项卡时,数据已更改

我删除了一些代码,因为它不再相关。我实现了游标加载程序,而不是我自己的观察者模式来通知更改。这是我现在的主要活动

问题是,如果我想在这些片段中重新绘制视图,我现在应该怎么做。如果我应用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) {
}
}
公共类架构活动扩展活动实现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附带的数据库教程