【问题标题】:Viewpager with Tablayout not working proper带有 Tablayout 的 Viewpager 无法正常工作
【发布时间】:2016-12-31 04:24:05
【问题描述】:

在这里我得到的结果是......

  1. 活动开始..

    当时这两个片段调用 -> 片段 1 加载 -> Fragment 2 在后台加载

  2. 向右交换(意味着从片段 1 到片段 2)

    当时我在片段二,同时 -> Fragment 3 在后台加载

  3. 向右交换(意味着从 Frag 2 到 3 然后)

    --> 没什么问题。

这是我的代码

主要活动

@Override
protected void onCreate(Bundle savedInstanceState) {

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);


}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new OneFragment(), "ONE");
    adapter.addFragment(new TwoFragment(), "TWO");
    adapter.addFragment(new ThreeFragment(), "THREE");
    viewPager.setAdapter(adapter);
}

这是我的适配器类

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

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

    @Override
    public int getCount() {
        return mFragmentList.size();
    }
   // add fragment 
    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }
    // for title
    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

现在有 3 个片段,那个片段没有任何内容.....

【问题讨论】:

  • 您是否在更改选项卡时遇到片段丢失数据的问题?抱歉,无法正确回答您的问题。
  • 我的意思是,当片段 1 同时加载时,片段 2 OnCreateView 也会加载......同样的方式.. 当我要去片段 2 时片段 3 onCreateView 调用
  • 那么问题出在哪里?加载下一个片段是正常的 VIewPager 行为。
  • 那么如何用片段来实现呢????我想要水平滚动功能 ..nd 在滚动上更改片段
  • “ViewPagerAdapter 总是加载下一个片段而不是当前片段”这是你的问题

标签: android android-layout android-fragments android-viewpager android-tablayout


【解决方案1】:

ViewPager setOffscreenPageLimit 默认为 1

请查看此链接 Visit Documentation

更新 请重写片段的这个方法

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {

        // load data here
    }else{
        // fragment is no longer visible
    }
}

【讨论】:

  • @RjzSatvara 为什么设置一次只加载当前片段?
  • 因为fargment 2有一些服务是调用。我只想在片段 2 被调用或加载时调用它
  • 请覆盖片段的 setUserVisibleHint(boolean isVisibleToUser) 方法
  • 我有测试演示和检查条件 isVisibleToUser 它对我的工作
【解决方案2】:

使用本教程..这可能会对您有所帮助

http://www.androidhive.info/2015/09/android-material-design-working-with-tabs/

您无需在 onCreate 方法中包含此行(删除此行)

 viewPager.setCurrentItem(0);
 viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

默认情况下,Viewpager 会将起始索引设置为 '0'..

【讨论】:

  • 不工作,片段 2 也与片段 1 一起加载
【解决方案3】:

用这个替换你的代码。这在我的应用上运行良好:

@Override
protected void onCreate(Bundle savedInstanceState) {

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    assert tabLayout != null;
    tabLayout.setupWithViewPager(viewPager);

    tabLayout.setSelected(true);
}

而且不需要添加viewPager.setCurrentItem(0);

因为默认情况下 ViewPager 将设置为起始索引 0。正如 Ajay Jayendran 所说。

希望这会奏效。 (:

【讨论】:

  • Activity 启动时 Fragment 1 和 Fragment 2 也加载...而不是仅加载 Fragment 1。
  • 是的,你的和我的都有相同的代码..你的代码没有问题..你在 XML 中设置了 ViewPage 宽度和高度 match_parent..???
  • 那么我认为这是你的片段中的问题......现在你必须把你所有的代码都放好......否则我们无法解决你的问题亲爱的......
  • Fragment 中什么都没有……只有 OnCreateView 和 Log.e("","")。
  • 尝试使用你所有的 Fragment 来导入这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2017-11-29
  • 1970-01-01
相关资源
最近更新 更多