Android 持久化片段和viewpager
我想在Android应用程序中使用3个片段,I red: .但我想使用viewpager来滑动和显示片段,如中所述: .但此代码或Android Studio示例的默认代码,每次需要时使用newInstance创建实例,不需要时销毁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)
// 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是对的。在
活动
中不应该有片段引用
。我建议不要使用您还可以为每个片段分配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个片段的指针。效果很好,直到我倾斜屏幕,当方向改变时,任何手指滑动以获取以下片段都会导致应用程序崩溃。为什么?