持久片段和 viewpager
Persistant fragments and viewpager
我想在一个 Android 应用程序中使用 3 个片段,我是红色的:
Creating-and-Using-Fragments
.但我想使用 viewpager 来滑动和显示片段,如下所述:
ViewPager-with-FragmentPagerAdapter
.但是这段代码还是Android Studio Example的默认代码,使用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");
}
}
并且只有 hide/show 个,如示例所示:
// ...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;
在一个 Fragment 的 MainActivity 中。
如果我将刚刚在 MainActivity onCreate 中创建的 Fragment 的指针分配给指向 MainActivity.tableaux
,数据将是持久的
您可以 return 在 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 是对的。 Activity
中不应该有 fragment references
。我建议不要使用 setOffscreenPageLimit
增加屏幕外页面限制,而应考虑使用 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
的 public void onSaveInstanceState(Bundle)
和 savedInstanceState
参数来保存和恢复 fragment
状态。
@Lotfi 您不需要将片段保存在 activity 中,它很容易泄漏。
您还可以为每个片段分配 id,稍后当您需要重用该片段时,您可以通过传递 ie 请求片段管理器 return 片段。通过在 getItem()
.
中调用片段管理器方法 findFragmentByID()
我想在一个 Android 应用程序中使用 3 个片段,我是红色的: Creating-and-Using-Fragments .但我想使用 viewpager 来滑动和显示片段,如下所述: ViewPager-with-FragmentPagerAdapter .但是这段代码还是Android Studio Example的默认代码,使用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");
}
}
并且只有 hide/show 个,如示例所示:
// ...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;
在一个 Fragment 的 MainActivity 中。 如果我将刚刚在 MainActivity onCreate 中创建的 Fragment 的指针分配给指向 MainActivity.tableaux
,数据将是持久的您可以 return 在 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 是对的。 Activity
中不应该有 fragment references
。我建议不要使用 setOffscreenPageLimit
增加屏幕外页面限制,而应考虑使用 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
的 public void onSaveInstanceState(Bundle)
和 savedInstanceState
参数来保存和恢复 fragment
状态。
@Lotfi 您不需要将片段保存在 activity 中,它很容易泄漏。
您还可以为每个片段分配 id,稍后当您需要重用该片段时,您可以通过传递 ie 请求片段管理器 return 片段。通过在 getItem()
.
findFragmentByID()