Android TabLayout中的片段仅在用户滑动时加载

Android TabLayout中的片段仅在用户滑动时加载,android,android-fragments,android-viewpager,android-tablayout,Android,Android Fragments,Android Viewpager,Android Tablayout,您好,我正在制作一个应用程序,其中包含一个片段,并且使用tablayout和viewpager制作了几个子片段。问题是我的所有子片段(从Tablayout)始终执行(每当用户单击父片段,加载其中的所有代码)。如何让子片段仅在用户滑到它时加载(例如,我有2个选项卡,当用户滑到选项卡2时才加载选项卡2中的内容) 这是我的父母fragmentcode public class ManageEventFragment extends Fragment { public ManageEvent

您好,我正在制作一个应用程序,其中包含一个
片段
,并且使用
tablayout
viewpager
制作了几个子
片段
。问题是我的所有子
片段
(从
Tablayout
)始终执行(每当用户单击父
片段
,加载其中的所有代码)。如何让子
片段
仅在用户滑到它时加载(例如,我有2个选项卡,当用户滑到选项卡2时才加载选项卡2中的内容)

这是我的父母
fragment
code

public class ManageEventFragment extends Fragment {


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


    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View viewFragment = inflater.inflate(R.layout.fragment_manage_event, container, false);

        viewPager = (ViewPager) viewFragment.findViewById(R.id.viewPager);

        tabLayout = (TabLayout) viewFragment.findViewById(R.id.tabLayout);

        viewPager.setAdapter(new CustomAdapter(getChildFragmentManager(), getContext()));
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        return viewFragment;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        //        tabLayout.setupWithViewPager(viewPager);
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
            }
        });

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }
        });

        if (ViewCompat.isLaidOut(tabLayout)) {
            tabLayout.setupWithViewPager(viewPager);
        } else {
            tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
                @Override
                public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                    tabLayout.setupWithViewPager(viewPager);
                    tabLayout.removeOnLayoutChangeListener(this);
                }
            });
        }

        super.onActivityCreated(savedInstanceState);

    }


    //TabLayout and ViewPager class
    private class CustomAdapter extends FragmentPagerAdapter {

        private String fragments[] = {"Edit Event", "Create Event"};

        public CustomAdapter(FragmentManager fragmentManager, Context context) {
            super(fragmentManager);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new EditEventFragment();
                case 1:
                    return new CreateEventFragment();
                default:
                    return null;
            }
        }

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

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

    }

}
和我的子片段代码。我希望这些代码只在用户滑到子选项卡时执行。非常感谢您的帮助,谢谢

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

        //Initializing our listEvents list
        listEvents = new ArrayList();

        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);

        adapter = new EventAdapterEdit(getContext(),listEvents);
        recyclerView.setAdapter(adapter);


        requestQueue = Volley.newRequestQueue(getContext());

        adapter = new EventAdapterEdit(getContext(),listEvents);
        recyclerView.setAdapter(adapter);

        getEventDetailRespond(requestQueue);
您可以在
ViewPager
适配器中的片段中使用上述方法

if(isVisibleToUser){//dosomething when the fragment is visible}
else{//dosomething else.}
请注意不要在那里初始化视图或任何东西,而是在
onViewCreated
中初始化视图,并调用要在
setUserVisibleHint
上执行的方法。另一个难看的方法是在
ViewPager
中添加滚动侦听器,获取当前项目位置并触发frag中的操作注释。要从
查看页面
适配器
获取片段,可以执行以下操作:

 MyFragment frag = (MyFragment) pager.getAdapter().instantiateItem(pager, position);

然后,您可以调用
MyFragment

中的方法。默认情况下,Viewpager会加载相邻的片段,以确保应用程序平滑,这样当用户滑动到片段(已加载)时,片段就在那里。要更改默认行为,请使用
viewpager.setOffscreenPageLimit(int limit)
其中limit是指将预加载的片段旁边的片段数量。
希望这有助于

@Override public void setUserVisibleHint(boolean isVisibleToUser){super.setUserVisibleHint(isVisibleToUser);}
感谢yrs代表。你能描述得更详细一点吗。我需要把上面的子片段代码放在@Override public void setUserVisibleHint(boolean isVisibleToUser){super.setUserVisibleHint)上(isVisibleToUser);}?android什么时候会向选项卡视图添加回调?我尝试了yrs第一个方法,但似乎不起作用。我将所有视图代码移动到OnCreateView,只留下获取数据的方法GetEventDetailResponse(requestQueue);在@Override public void setUserVisibleThint(布尔isVisibleToUser){super.setUserVisibleThint(isVisibleToUser);}但是得到了空指针错误(我在GetEventDetailRespond中有progressbar.SetVisibility,而不是使用getChildFragmentManager()你能调用getActivity().getSupportFragmentManager()吗看看这是否能解决问题?但是我仍然鼓励您对我提供的答案进行一些调试。似乎可以处理简单的测试Toast消息,但当我放置fetch data方法时。返回null指针。这是我的方法代码,显示的错误在这行
ProgressBar.setVisibility(int)中
正如我所提到的,在ViewCreated和
setUserVisibleHint上初始化您的视图
它在
onViewCreated
之前被调用,所以请检查空值。但问题是,每当方法从服务器获取数据时,我需要进度条可见。当从服务器收到响应时,进度条将被显示出现。非常感谢。因此,默认情况下,如果我有3个片段,当用户单击父片段时,只会加载前2个片段?viewsetOffscreenPageLimit(int limit)的放置位置(在父片段或子片段上)?可以详细介绍一下如何实现此功能吗?我在回答中输入了一个错误。已编辑。您可以在ViewPager上调用该方法。我似乎不起作用。我有两个子片段。当我放置ViewPager.setOffscreenPageLimit(0)时在我的父项OnCreateView中。每当用户单击父项时,子片段第二个选项卡中的所有代码仍将加载fragment@LêKhánhVinh最小屏幕外页面限制为1。
ViewPager
将从屏幕上加载内容,以便在用户开始滚动时准备就绪。您无法避免。非常感谢。因此,如果我有喜欢的3个选项卡,则t当设置为默认值1时,第三个将不会自动加载?
 MyFragment frag = (MyFragment) pager.getAdapter().instantiateItem(pager, position);