android - 持久 fragment 和 viewpager

标签 android android-fragments android-viewpager fragmenttransaction

我想在 Android 应用程序中使用 3 个 fragment ,我是红色的: Creating-and-Using-Fragments .但我想使用 viewpager 来滑动和显示 fragment ,如下所述: 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");
    }
}

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

    // ...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,数据将是持久的

最佳答案

您可以在 getItem 方法中返回预初始化的 fragment 。

@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 引用。我建议不要使用 setOffscreenPageLimit 来增加屏幕外页面限制,而应该考虑使用 public void onSaveInstanceState(Bundle)savedInstanceState public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 参数。

关于android - 持久 fragment 和 viewpager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41380401/

相关文章:

android - 如何在 Android 中以编程方式从设备读取短信?

android - 如何在 ViewPager 中添加自定义 View 以进行演练

android - YouTube API 播放列表参数不适用于 YouTube 应用

java - Android - Jacoco 代码覆盖忽略 Robolectric 测试

android - Greenrobot 的 Eventbus : Two Fragments calling async tasks jobs got Eventbus confused

android - 经度和纬度的双值未传递给 googlemap 标记

java - 基本 fragment 上的 android.view.InflateException

java - 永远不会为第一项调用 OnPageSelected?

android - 如何在控件到达某个位置时禁用 ViewPager 中的左滑动

android - 如何实现多个fragments的滑动tab导航