【问题标题】:View Pager is calling other fragments on startup and on swiping tooView Pager 在启动和滑动时也调用其他片段
【发布时间】:2018-01-24 10:37:28
【问题描述】:

我的应用中的组件列表如下:

  1. TabLayout - Tab1、Tab2、Tab3。
  2. 标签片段 - Tab1.xml & class、Tab2.xml & class、Tab3.xml & class。
  3. ViewPager 在标签上显示片段。

所以,当应用程序在我调试启动过程时启动时,它的工作方式如下:

  1. 它调用“Tab1.class”,
  2. 然后它调用“Tab2.class”,

当从“Tab1”滑动到“Tab2”时,它会调用“Tab3.class”。

当从“Tab2”滑动到“Tab3”时,它什么也不调用。

关于反向滑动:

从“Tab3”滑动到“Tab2”时,调用“Tab1.class”。

然后当从“Tab2”滑动到“Tab1”时,它什么都不调用。

问题:

  1. 那么,它为什么要这样做呢?

  2. 当应用在“tab1”上启动时,我如何才能只调用“tab1.class”?

  3. 当我从“tab1”滑动到“tab2”时,如何只调用“tab2.class”?


MainActivity.java

    public class MainActivity extends AppCompatActivity {

    private TabLayout tabLayout;
    private ViewPager viewPager;

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

        viewPager = (ViewPager) findViewById(R.id.viewPager);
        PagerAdapter pagerAdapter = new FixedTabsPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(pagerAdapter);

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

    class FixedTabsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {
            switch (position)
            {
                case 0:
                    return new Tab1();
                case 1:
                    return new Tab2();
                case 2:
                    return new Tab3();
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
             return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position)
            {
            case 0:
                return getString(R.string.tab1);
            case 1:
                return getString(R.string.tab2);
            case 2:
                return getString(R.string.tab3);
                default:
                    return null;
            }
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="vwc.com.newconcept.MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.Toolbar
                android:id="@+id/main_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <android.support.v4.view.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <android.support.design.widget.TabLayout
                    android:id="@+id/tabLayout"
                    app:tabMode="scrollable"
                    app:tabGravity="center"
                    android:layout_gravity="top"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

            </android.support.v4.view.ViewPager>

        </android.support.design.widget.AppBarLayout>

</android.support.v4.widget.DrawerLayout>

请告知此问题的解决方案。

【问题讨论】:

  • mViewPager.setOffscreenPageLimit(1);你试过设置这个吗?
  • define it calls 'TabX.class' ...如果这意味着创建片段类实例,那么请想一想:如何在滑动时看到两个片段而不创建他们?
  • @Dipalis。不,我没有。我应该把它放在哪里? viewPager.setAdapter(pagerAdapter);??
  • @Dipalis。谢谢,但它不起作用。

标签: android android-fragments android-viewpager android-tablayout android-studio-3.0


【解决方案1】:

setOffscreenPageLimit

设置在空闲状态下视图层次结构中当前页面任一侧应保留的页面数。超出此限制的页面将在需要时从适配器重新创建。

希望这会有所帮助。

ViewPager mViewpager = (ViewPager)findView....
mViewPager.setOffscreenPageLimit(3);

【讨论】:

  • 它会在启动时初始化所有 3 个片段,然后当我滑动时它不会这样做。
【解决方案2】:

ViewPager 旨在以这种方式工作以避免在animations 中滞后,同时从一个fragment 切换到另一个fragment,它将在您的可见Fragment 旁边加载至少一个额外的fragment它确保有滑动范围。

因为,虽然滑动视图分页器具有同时显示两个片段的能力,因此总是加载一个额外的片段,没有两个页面视图分页器是无用的。

【讨论】:

  • 是的,但是当我从 tab3 滑动到 tab2 时,我不想初始化 tab1 的组件。
  • 当我从tab2滑动时它不会初始化tab1的组件。
  • 到2的时候已经初始化了,只会渲染它的实例
【解决方案3】:

片段可见时刷新片段

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (getFragmentManager() != null) {
        getFragmentManager()
                .beginTransaction()
                .detach(this)
                .attach(this)
                .commit();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多