Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带ViewPager的TableLayout未按预期工作_Android_Android Viewpager_Android Tablayout - Fatal编程技术网

Android 带ViewPager的TableLayout未按预期工作

Android 带ViewPager的TableLayout未按预期工作,android,android-viewpager,android-tablayout,Android,Android Viewpager,Android Tablayout,在我的应用程序中有3个TabLayout和ViewPager 如果我滑动更改选项卡,则它的行为异常 下面是场景 比如说3个标签A,B,C 启动应用程序时,默认选项卡A将打开 从A转到B-工作正常。 从B转到A-工作正常。 从A转到B-工作正常。 从B转到C-工作正常。 现在问题从这里开始。 从C转到B-它将同时加载A和B,但仅显示B。 如果我来自C,为什么A和B会加载 下面是我的代码 private Toolbar toolbar; private TabLayout tabLayout

在我的应用程序中有3个
TabLayout
ViewPager

如果我滑动更改选项卡,则它的行为异常

下面是场景

比如说3个标签A,B,C

启动应用程序时,默认选项卡A将打开

从A转到B-工作正常。
从B转到A-工作正常。
从A转到B-工作正常。
从B转到C-工作正常。

现在问题从这里开始。
从C转到B-它将同时加载A和B,但仅显示B。

如果我来自C,为什么A和B会加载

下面是我的代码

private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    ViewPagerAdapter adapter;

toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(false);

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

private void setupViewPager(ViewPager viewPager) {
        adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new FragmentOpen(), "OPEN");
        adapter.addFragment(new FragmentClose(), "CLOSE");
        adapter.addFragment(new FragmentTest(), "TEST");
        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();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
但是当我从C来的时候,它总是会同时加载两个标签

我想要的是:当来自C时,只有选项卡B必须加载,而不是两者都加载


使用
ViewPager
时,这是不可能的
ViewPager
根据您的滑动方向至少加载
当前
片段的
右/左
相邻
片段

如果阅读
ViewPager
文档,则有一种方法
ViewPager.setOffscreenPageLimit(LIMIT)
支持屏幕外页面限制,其
默认值为
1

SetOffscreenPageLimit:

设置应保留到页面两侧的页数 视图层次结构中处于空闲状态的当前页面。除此之外的页面 需要时,将从适配器重新创建限制

这是作为一种优化提供的。如果你事先知道号码 您将需要支持的页面的数量,或者在其中具有延迟加载机制 放置在您的页面上,调整此设置在 感知到分页动画和交互的平滑度。如果你有 少量页面(3-4页)可同时保持活动状态, 新创建的视图子树的布局时间将减少 用户来回翻页

您应该将此限制保持在较低的水平,尤其是当您的页面具有复杂的 布局。此设置默认为1

以下是一些相关的答案:

1.

2.


3.

使用
ViewPager
时不可能
ViewPager
根据您的滑动方向至少加载
当前
片段的
右/左
相邻
片段

如果阅读
ViewPager
文档,则有一种方法
ViewPager.setOffscreenPageLimit(LIMIT)
支持屏幕外页面限制,其
默认值为
1

SetOffscreenPageLimit:

设置应保留到页面两侧的页数 视图层次结构中处于空闲状态的当前页面。除此之外的页面 需要时,将从适配器重新创建限制

这是作为一种优化提供的。如果你事先知道号码 您将需要支持的页面的数量,或者在其中具有延迟加载机制 放置在您的页面上,调整此设置在 感知到分页动画和交互的平滑度。如果你有 少量页面(3-4页)可同时保持活动状态, 新创建的视图子树的布局时间将减少 用户来回翻页

您应该将此限制保持在较低的水平,尤其是当您的页面具有复杂的 布局。此设置默认为1

以下是一些相关的答案:

1.

2.

3.

它的默认行为是
ViewPager
,如果您在A中,那么它将加载B 同时,当你到达B时,它将加载C,A现在也加载 当到达C时,它会破坏A的视图,现在当你来的时候 再次加载到B,它将以一种简单的方式再次加载A 默认情况下,一个
Next
和一个
previous
视图状态

要克服这个问题,您应该使用
ViewPager.setOffscreenPageLimit(number)
这里number是下一个和上一个视图模拟加载的页面数

它的默认行为是
ViewPager
,如果您在A中,那么它将加载B 同时,当你到达B时,它将加载C,A现在也加载 当到达C时,它会破坏A的视图,现在当你来的时候 再次加载到B,它将以一种简单的方式再次加载A 默认情况下,一个
Next
和一个
previous
视图状态


要解决这个问题,您应该使用
ViewPager.setOffscreenPageLimit(number)
这里number是下一个和上一个视图模拟加载的页面数。

我只有3个选项卡,设置
ViewPager.setOffscreenPageLimit(2)
对我有效


试试看
ViewPager.setOffscreenPageLimit(tottables-1)
我只有3个选项卡,而设置
ViewPager.setOffscreenPageLimit(2)
对我很有效


请尝试
ViewPager.setOffscreenPageLimit(totTabs-1)

这是因为ViewPager加载当前选项卡以及下一个可见选项卡的数据。您的表布局位于活动或片段内?。getItem(position.onResume();这不是更改片段的最佳方法,您应该替换片段。@Jonathanase它位于“活动”内部。这是因为ViewPager加载了当前选项卡以及下一个可见选项卡的数据。您的tabLayout位于“活动”或“片段”内部?。getItem(position.onResume();这不是更改片段的最佳方式,您应该替换片段。@Jonathanase它在活动中。您能为这一点提供任何替代方案吗?我想阻止加载选项卡。如果我滑动选项卡,它将不会加载任何选项卡。您可以尝试使用
界面
。在
活动中编写
接口
,并从
片段
类中实现它。将addOnPageChangeListener添加到viewpager,将SetOnAbsSelectedListener添加到TableLayout。从那些李斯特
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if(adapter != null){
                    adapter.getItem(position).onResume();
                }
                Toast.makeText(getApplicationContext(), "Page Selected", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });