android - 将 viewpager 与特定 fragment 一起使用

标签 android android-fragments android-viewpager

我正在创建一个使用 viewpager 在 4 个特定 fragment 之间滑动的应用。

到目前为止我看过的所有viewpager的例子,每次调用FragmentPagerAdapter的getPosition方法都会创建新的fragments。所以它是这样的:

return FragmentA.newInstance();

我所做的如下:

在主要 Activity 中

public static final int FRAGMENTS = 4;
public static final String FRAGMENT_LIST ="LIST";
public static final String FRAGMENT_SETTINGS = "SETTINGS";
public static final String FRAGMENT_MAP = "MAP";
public static final String FRAGMENT_TICKET = "TICKET";

MainAdapter _adapter;
ViewPager _pager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager()
                .beginTransaction()
                .add(new FragmentMap(), FRAGMENT_MAP)
                .add(new FragmentList(), FRAGMENT_LIST)
                .add(new FragmentTicket(), FRAGMENT_TICKET)
                .add(new FragmentSettings(), FRAGMENT_SETTINGS)
                .commit();
    }

    _adapter = new MainAdapter(getSupportFragmentManager());
    _pager = (ViewPager) findViewById(R.id.pager);
    _pager.setAdapter(_adapter);
}

在适配器中:

public class MainAdapter extends FragmentPagerAdapter {

FragmentManager _manager;

public MainAdapter(FragmentManager fm) {
    super(fm);
    _manager = fm;
}

@Override
public Fragment getItem(int position) {
    return _manager.getFragments().get(position);
}

@Override
public int getCount() {
    return ActivityMain.FRAGMENTS;
}
}

这会引发异常,因为适配器正在尝试更改 getItem 中每个 fragment 的标签

我的问题是:

a) 每次都使用相同的 fragment 是不是不正确?我没有看到使用上述方法或类似方法的示例,它们总是在 getItem 方法中创建一个新实例

b) 如果我希望 fragment 具有一些持久性,那么这是否意味着我应该将每个 fragment 应持有的数据存储在静态变量中并始终创建使用这些变量的新实例?

最佳答案

a) 您必须在 getItem() 方法中创建一个新实例,每次您从 viewpager 切换 fragment 时都不会调用此方法。

我建议你像这样使用你的适配器

public class MainAdapter extends FragmentPagerAdapter {

public MainAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
            case 0 :
                return new FragmentMap();
            case 1 :
                return new FragmentList();
            case 2 :
                return new FragmentTicket();
            case 3 :
                return new FragmentSettings();
            default :
                return null;
}

@Override
public int getCount() {
    return ActivityMain.FRAGMENTS;
}
}

b) FragmentPagerAdapter 中的 fragment 是持久的,只有当您在 ViewPager 中切换多个 fragment 时,它们才会被重新创建。例如,您可以通过 _pager.setOffscreenPageLimit(3); 设置刷新限制,如果您不想在您的案例中重新创建您的 fragment 。

更多信息:http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

关于android - 将 viewpager 与特定 fragment 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28832260/

相关文章:

android - fragment : which callback invoked when press back button & customize it

android - 从 fragment 开始一个 Activity

android - ViewPager 具有不同的纵向和横向适配器

java - Robolectric 测试 gridview onclick 开始新 Activity

java - Android 中是否有创建、更新数据并将数据传递到 fragment 或 Activity 的约定?

java - 如何在特定的 ViewPager 页面隐藏 View ?请查看详情

android - 是否可以知道ViewPager中显示的是哪张图片?

java - 带有 com.google.android.gms.common.api.ApiException : 7508 的 Google Awareness API Places

android - ant.properties中如何设置Android库的绝对路径?

android - ListView 在 Scroll 上改变数据