Android片段选项卡在方向更改时创建两次

时间:2016-06-01 21:57:52

标签: android android-fragments

我是一名Java兽医,但在Android上是新手。

无论如何,以下是我的Activity.onCreate()方法的代码块:

allContactsPage = new AllContactsPage();
allGroupsPage = new AllGroupsPage();

ViewPager viewPager = (ViewPager) findViewById(R.id.contactsTabsViewPager);
ContactsTabsPagerAdapter tabsAdapter = new ContactsTabsPagerAdapter(getSupportFragmentManager(), allContactsPage, allGroupsPage);
viewPager.setAdapter(tabsAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.contactsActivityTabs);
tabLayout.setupWithViewPager(viewPager);

contactsService.loadAllContacts(this);

allContactsPage和allGroupsPage是片段。我使用ViewPager和FragmentPageAdapter(ContactsTabsPagerAdapter)将它们添加到TabLayout。

毕竟,我在我的服务上调用loadAllContacts(this)。 "这"作为回调传递,所以当它完成后,它会回调到活动中,活动会用它们应该显示的数据更新两个碎片(两个碎片都是实例变量)。

我的问题是,在旋转时,会创建每个片段中的两个。 UI中显示一个版本,回调调用另一个版本。因此,在UI中显示的那个是空白的,永远不会获取数据。

我已经看过很多关于这个问题的帖子,但我还没有看到如何使用ViewPager / FragmentPagerAdapter管理的片段来完美处理它。我只是想知道如何确保我有正确的片段引用来将数据传递给旋转。

一旦我解决了问题,我可能会考虑避免在轮换时加载数据,但我已经知道如何做到这一点。只需要弄清楚如何正确显示它。

感谢。

2 个答案:

答案 0 :(得分:0)

<activity
     android:name=".YourActivity"
     android:configChanges="orientation|screenSize|keyboardHidden" />

OR

<activity
     android:name=".YourActivity"
     android:screenOrientation="portrait" />

答案 1 :(得分:0)

尝试将Fragment实例化移动到ContactsTabPagerAdapter。像

这样的东西
@Override
public Fragment getItem(int position) {
    switch(position) {
        case 0: return new AllContactsPage();
        case 1: return new AllGroupsPage();
        default: throw new IllegalArgumentException();
    }
}

PagerAdapter包含重用片段的逻辑,应该为您处理。见https://github.com/android/platform_frameworks_support/blob/master/v4/java/android/support/v4/app/FragmentPagerAdapter.java#L90