0

我是 Android 程序员迈出的第一步。在我的应用程序中,我决定使用 ViewPager (support.v4)。

我以非常典型的方式创建所有片段:

@Override
public void onCreate(Bundle savedInstanceState) {

(...)
        //let's initialize view pager
        List<Fragment> fragments = new ArrayList<Fragment>();
        fragments.add(new MainActivitySelectDatabase());
        fragments.add(new MainActivityDetails());
        mainActivityPageAdapter = new MainActivityPageAdapter(getSupportFragmentManager(), fragments);
        mainActivityViewPager = (ViewPager) findViewById(R.id.main_activity_view_pager);
        mainActivityViewPager.setAdapter(mainActivityPageAdapter);
(...)

    }

接下来我想通过以下方式通知所有片段关于一个事件:

protected void informAllFragmentsWhenDatabaseStatusChanged () {
    for (int i=0; i<mainActivityPageAdapter.getCount(); i++) {
        ((InterfaceMainDatabaseStatusChanged) mainActivityPageAdapter.getItem(i)).onMainDatabaseStatusChanged();
    }

}

如果我不改变屏幕方向,一切似乎都正常。当我改变它时,一切都变得疯狂。Fragment 中的 getActivity 或 getApplication 等方法返回 null。我猜由于未知原因,该方法是针对旧版本的片段执行的,而不是针对新版本的。应该如何解决?如何列出主要活动中所有片段的当前版本?

提前感谢您的帮助。

4

1 回答 1

1

我猜由于未知原因,该方法是针对旧版本的片段执行的,而不是针对新版本的。

那些未知的原因是只有当它没有该页面片段的有效实例ViewPager时才调用该方法(并且在配置更改之后,将通过 引用这些片段)。您的选择是摆脱片段列表并简单地直接在方法中实例化正确的片段(并且还使用不同的方法来访问片段)或进一步扩展适配器,以便您的列表始终具有对的片段。getItem()ViewPagerFragmentManagergetItem()ViewPager

对于选项一,请查看此问题。您还可以通过接口实现通信,将ViewPageronAttach方法中的每个片段注册到某种WeakReference结构的活动中(并在需要访问片段时使用它)。

要进一步扩展适配器,请查看该instantiateItem()方法。

于 2013-10-28T20:50:08.127 回答