当前位置: 首页 > 知识库问答 >
问题:

ViewPager-第一个片段总是在看不见时被重新创建(onPause->onStop->OnTach->…onResume)

墨安阳
2023-03-14

所以我用FragmentStatePagerAdapter实现了一个ViewPager,我有两个片段。我用参数1和2调用了setOffscreenPageLimit(),希望片段不会被重新创建,但是第一个片段总是被重新创建,而第二个片段被创建。

第一个片段总是经过这些步骤,只要它离开视野(向右滑动到另一个片段,或者点击主页按钮,等等...)

  • on暂停
  • onStop
  • onAttach
  • 创建
  • onCreateView
  • 启动
  • on简历

出于某种原因,第二个片段只被创建一次,如果我滑动到第一个片段,它的行为与预期的一样-除非我按下“主页”按钮或“电源”按钮,否则它不会被重新创建。我想要的行为是,这两个片段在应用程序期间创建一次。

我的片段结构如下所示:

我有一个框架布局的活动。我将我的SlidingTabFra点添加到FrameLayout。幻灯片本身包含两个片段(2个标签)

FragmentStatePagerAdapter

public class TabsPagerAdapter extends FragmentStatePagerAdapter {

    /** Constructor of the class */
    public TabsPagerAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.mContext = context;
    }

    /** This method will be invoked when a page is requested to create */
    @Override
    public Fragment getItem(int arg0) {
        switch(arg0){
            /** tab1 is selected */
            case 0:
                Fragment1 frag1 = new Fragment1();
                return frag1;
            /** tab2 is selected */
            case 1:
                Fragment2 frag2 = new Fragment2();
                return frag2;
        }
        return null;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return Settings.TAB_TITLES[position];
    }

    /** Returns the number of pages */
    @Override
    public int getCount() {
        return Settings.TAB_TITLES.length;
    }
}

父片段:

public class SlidingTabFragment extends Fragment {

    ViewPager pager = null;
    TabsPagerAdapter adapter = null;
    SlidingTabLayout tabs = null;

    public static SlidingTabFragment newInstance() {
        SlidingTabFragment fragment = new SlidingTabFragment();
        return fragment;
    }

    public SlidingTabFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        adapter =  new TabsPagerAdapter(getChildFragmentManager(), getActivity());

        pager = (ViewPager) view.findViewById(R.id.pager);
        pager.setAdapter(adapter);
        pager.setOffscreenPageLimit(2);

        // Assigning the Sliding Tab Layout View
        tabs = (SlidingTabLayout) view.findViewById(R.id.sliding_layout);
        tabs.setCustomTabView(R.layout.custom_tab_view, 0);
        tabs.setDistributeEvenly(true);

        // Setting indicator color to white
        tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
            @Override
            public int getIndicatorColor(int position) {
                return getResources().getColor(R.color.White);
            }
        });

        tabs.setViewPager(pager);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_sliding_tab, container, false);
    }
}

R.layout.fragment_sliding_tab

<LinearLayout xmlns:android="html" target="_blank">http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_series_details"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <com.myapp.views.SlidingTabLayout
        android:id="@+id/sliding_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="2dp"
        android:background="@color/tab_bar_background_color"
        />
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_height="0dp"
        android:layout_width="match_parent"
        android:layout_weight="1" />
</LinearLayout>

共有1个答案

韦熙云
2023-03-14

将此添加到片段中:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // load data here
    }else{
       // fragment is no longer visible
    }
}
 类似资料:
  • 我有一个ViewPager+FragmentPageAdapter的问题。 场景:我有一个活动在片段a的内部,片段a有一个ViewPager,片段B1,e片段B2。B1 e B2是同一个类,但作为参数的数据不同。 FragmentPagerAdapter 片段B

  • 在我们的应用程序中,我们有一个带有FrameLayout的活动。这个布局显示了几个片段。要在片段之间进行更改,我们使用以下方法: 如果用该方法更改片段,一切都将正常工作。不幸的是,问题是后退按钮似乎被打破了。如果我们在其中一个片段处按下它,FrameLayout将正确更新。但碎片不会被摧毁。Android不调用onPause()、onStop()和OnDestroyView()方法。因此,操作栏没

  • 我有一个基于SherlockFragment的片段,其中包括一个ViewPager,通过FragmentStatePagerAdapter与Fractions一起操作。我实现了“无限”滚动,所以适配器返回getCount() 1000。它的工作原理。当我用另一个数据替换()主活动中的主要片段时,就会出现问题,onCreateView这个主片段在第一次初始化期间调用:我重新创建适配器并将其设置为Vi

  • 在使用带有片段的时,在选项卡之间移动时不会调用我们的和方法。我们有什么办法可以从碎片中找出我们是被发现还是被隐藏? 不幸的是,我在、中有逻辑,就像在location services注册一样,在切换选项卡时永远不会停止,因为在退出整个应用程序之前,永远不会调用。

  • 标题本身就是我的问题,每当我打开MainActivity,然后导航到汉堡包/抽屉菜单中可用的另一个片段,然后按/刷回以返回它重新创建的主屏幕(第一个片段)。导航组件有没有办法使其不重新创建第一个片段?我正在使用Android Studio生成的Jetpack导航模板,这似乎是默认行为。 这是主要活动 这是主片段(主活动中的第一个片段),其中包含子片段Asset片段 这是父片段托管的ViewPage

  • 当我在viewPager中从其相邻片段(0,2)中滑动到或选择Fragment1(片段编号为0-3)时,它的onCreateView或onCreate函数未被调用。 但是当我从Fragment3回扫或者选择Fragment1(当Fragment3是活动的)时,这两个函数都被调用了。我很困惑为什么不从相邻的片段中调用它。 这是未正确调用onCreateView的片段的代码 //Toast.MakeT