持久的片段和viewpager

时间:2016-12-29 13:08:28

标签: android android-fragments android-viewpager fragmenttransaction

我想在Android应用程序中使用3个片段,我是红色的: Creating-and-Using-Fragments 。但是我想使用viewpager来滑动和显示片段,如下所述: ViewPager-with-FragmentPagerAdapter 。但是这段代码或Android Studio示例的默认代码,使用newInstance创建实例,每次需要时都可以在不需要时进行销毁。

// Returns the fragment to display for that page
    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0: // Fragment # 0 - This will show FirstFragment
            return FirstFragment.newInstance(0, "Page # 1");
        case 1: // Fragment # 0 - This will show FirstFragment different title
            return FirstFragment.newInstance(1, "Page # 2");
        case 2: // Fragment # 1 - This will show SecondFragment
            return SecondFragment.newInstance(2, "Page # 3");
        default:
            return null;
        }
    }

但我想为所有人创造一次:

        // Within an activity

private FragmentA fragmentA;
private FragmentB fragmentB;
private FragmentC fragmentC;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        fragmentA = FragmentA.newInstance("foo");
        fragmentB = FragmentB.newInstance("bar");
        fragmentC = FragmentC.newInstance("baz");
    }
}

并且只隐藏/显示它们,如示例所示:

    // ...onCreate stays the same

// Replace the switch method
protected void displayFragmentA() {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (fragmentA.isAdded()) { // if the fragment is already in container
        ft.show(fragmentA);
    } else { // fragment needs to be added to frame container
        ft.add(R.id.flContainer, fragmentA, "A");
    }
    // Hide fragment B
    if (fragmentB.isAdded()) { ft.hide(fragmentB); }
    // Hide fragment C
    if (fragmentC.isAdded()) { ft.hide(fragmentC); }
    // Commit changes
    ft.commit();
}

但是如何使用FragmentPagerAdapter来做到这一点 public Fragment getItem(int position)不再必须像那样

此外,如何访问数据

 public double [][] tableaux;

来自一个片段的MainActivity。 如果我将MainActivity onCreate中创建的片段I指针指向MainActivity.tableaux

,那么数据将是持久的。

2 个答案:

答案 0 :(得分:1)

您可以使用getItem方法返回预先初始化的片段。

@Override
public Fragment getItem(int position) {
    switch (position) {
    case 0: return fragmentA;
    case 1: return fragmentB;
    case 2: return fragmentC;
    default: return null;
}

更新: @Alok是对的。您不应该fragment references中有Activity。我建议您不要使用setOffscreenPageLimit增加屏幕外页面限制,而应考虑保存&使用fragment的{​​{1}}和public void onSaveInstanceState(Bundle)参数恢复savedInstanceState个州。

答案 1 :(得分:0)

@Lotfi你不需要在活动中保存你的片段,它很容易泄漏。 您还可以为每个片段分配id,稍后当您需要重用该片段时,您可以要求片段管理器通过传递ie来返回片段。通过在-Wl,--whole-archive -lyourlib -Wl,--no-whole-archive 内调用片段管理器方法findFragmentByID()