Android:使用 ViewPager 更改 fragment

标签 android android-fragments android-viewpager pagerslidingtabstrip

我正在为 ViewPager 使用 PagerSlidingTabStriphttps://github.com/astuetz/PagerSlidingTabStrip .我想在滚动时更改 fragment 。我用下面的代码实现了这一点。

MainActivity.java

public class MainActivity extends SherlockFragmentActivity {

private MyPagerAdapter adapter;
ViewPager pager;
private PagerSlidingTabStrip tabs;

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

    tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
    pager = (ViewPager) findViewById(R.id.pager);
    adapter = new MyPagerAdapter(getSupportFragmentManager());

    pager.setAdapter(adapter);

    final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
            .getDisplayMetrics());
    pager.setPageMargin(pageMargin);

    tabs.setViewPager(pager);

}

public class MyPagerAdapter extends FragmentPagerAdapter {
    private final String[] TITLES = {"First","Second","Third"};
    private SherlockFragment[] fragments = new SherlockFragment[] { new FirstFragment(), new SecondFragment(), new ThirdFragment()};

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

    @Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }

    @Override
    public int getCount() {
        return TITLES.length;
    }

    @Override
    public Fragment getItem(int position) {
        return fragments[position];
    }

}
}

FirstFragment.java

public class FirstFragment extends SherlockFragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View v = inflater.inflate(R.layout.fragment_main, container, false);
    Toast.makeText(getSherlockActivity(), "This is from first", Toast.LENGTH_SHORT).show();
    return v;
}
}

SecondFragment.java

public class SecondFragment extends SherlockFragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View v = inflater.inflate(R.layout.fragment_main, container, false);
    Toast.makeText(getSherlockActivity(), "SecondFragment", Toast.LENGTH_SHORT).show();
    return v;
}
}

ThirdFragment.java

public class ThirdFragment extends SherlockFragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View v = inflater.inflate(R.layout.fragment_main, container, false);
    Toast.makeText(getSherlockActivity(), "ThirdFragment", Toast.LENGTH_SHORT).show();
    return v;
}
}

我得到了三个 fragment ,我正在用 Toasts 测试它们。

当应用程序打开 MainActivity 时,FirstFragment 附加到 Activity ,但它显示了两个 toast,一个来自 Firstragment ,另一个来自 SecondFragment ,当我滚动到第二个选项卡时,它显示了ThirdFragment 的 toast 。

所以,我想它是这样进行的。如果我从左向右滚动,则显示当前 fragment 右侧的 fragment ,如果我从右向左滚动,则显示当前 fragment 左侧的 fragment 。请帮忙。

谢谢。

最佳答案

这是因为 fragment 缓存。当您访问某些 fragment 时,它的同级 fragment 也会被创建(调用 onCreate())。

关于Android:使用 ViewPager 更改 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16992721/

相关文章:

android - 使用 Javamail 发送电子邮件

android - 如何在没有 fragment 的情况下使我的应用程序适应平板电脑

android - 在 onTabSelected 中玩 fragment

tabs - 在 Espresso 测试时选择 native 标签

android - 在 RecyclerView 上与 ViewPager 同步显示所选项目

android - FAB( float 操作按钮)不 float

c# - Xamarin 转换器不适用于 IsEnabled 属性

android - 我应该为身份验证、Firebase 实时数据库服务和 Speech to text API 开放哪些 Google Cloud API

Android getExternalCacheDir() 返回 null

android - 在操作栏中设置 fragment 内的自定义 View