Android 持久化片段和viewpager

Android 持久化片段和viewpager,android,android-fragments,android-viewpager,fragmenttransaction,Android,Android Fragments,Android Viewpager,Fragmenttransaction,我想在Android应用程序中使用3个片段,I red: .但我想使用viewpager来滑动和显示片段,如中所述: .但此代码或Android Studio示例的默认代码,每次需要时使用newInstance创建实例,不需要时销毁 // Returns the fragment to display for that page @Override public Fragment getItem(int position) { switch (position)

我想在Android应用程序中使用3个片段,I red: .但我想使用viewpager来滑动和显示片段,如中所述: .但此代码或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();
}
但是如何用一个残缺的PageRadapter做到这一点呢 公共片段getItem(int位置)不再必须是这样

还有,如何访问数据

 public double [][] tableaux;
这是一个片段的主要活动。
如果我将刚刚在MainActivity onCreate中创建的片段的指针指定给MainActivity上的点,则数据将保持不变。tableaux

您可以在
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是对的。在
活动
中不应该有
片段引用
。我建议不要使用 StutOffStudioPuleLime<代码>来增加屏幕外页的限制,您应该考虑保存和恢复<代码>片段< /代码>状态,使用<代码>公共无效OnSaveStistChanStage(束)和<代码> SaveDestChansWeb <代码>公共视图OnCureVeVew(LayoutInflater充气机、ViewGroup容器、Bundle savedInstanceState)

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

我的片段将处理一个图表,因此每次你不需要重新创建它时,我都会浪费太多时间来重新创建它。它将由片段管理器管理,只需让它知道你要显示的片段,如果它已经在堆栈中,那么它将使用相同的片段。是的,我知道,但如果它不再在容器中,它需要重新创建它花点时间,请参阅我的第一个链接“创建和使用片段”中的“片段隐藏vs替换”因此,我需要保持内存,只需在内存之间进行交换,它将保留在内存中,但不附加到容器上,因此它将不受任何问题的重用。请考虑这个答案:谁保证碎片管理器不需要从内存中卸载它们,如果不再需要它们,它们将不再被重新创建,因为在MainActivity中只能执行一次操作。一旦您将它们创建为全局变量,它们将仅通过Activity从内存中删除,否则它们将在内存中。@Ravi Sisodia,在我放入超过3个片段(6个片段)之前,它一直在工作。然后,当从第4次刷卡到第3次或第5次刷卡时,应用程序崩溃@Ravi Sisodia可能与仅保存在容器中的3个片段有关。因此,我升级到mViewPager.setOffscreenPageLimit(6);但它不可能仍然崩溃。我是否可以更改viewpager或SectionsPagerAdapter,使其仅隐藏/显示,而不删除(或取消)片段?我用new op.resultsfragment=new resultsfragment()创建了我的所有片段,并在getItem中返回指向6个片段的指针。效果很好,直到我倾斜屏幕,当方向改变时,任何手指滑动以获取以下片段都会导致应用程序崩溃。为什么?