TabLayout 中的片段仅在用户滑动时加载 Android
Fragment in TabLayout only load when user slide Android
您好,我正在使用 tablayout
和 viewpager
制作一个应用程序,里面有一个 fragment
和几个 child fragment
。问题是我的所有 child fragment
(来自 Tablayout
)总是执行(每当用户单击 parent fragment
时加载所有代码。如何获取child fragment
仅在用户滑动到它时加载(例如我有 2 个选项卡,选项卡 2 中的内容仅在用户滑动到选项卡 2 时加载)
这是我的parentfragment
代码
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];
}
}
}
还有我的child片段代码。我希望这些代码仅在用户滑动到 child 选项卡时执行。非常感谢任何帮助,谢谢
@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);
@Override public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
}
您可以在 ViewPager
Adapter
的片段中使用上述方法
if(isVisibleToUser){//dosomething when the fragment is visible}
else{//dosomething else.}
请注意不要在那里初始化视图或其他任何东西,而是在 onViewCreated
中初始化您的视图并调用您想要在 setUserVisibleHint
上执行的方法。另一种丑陋的方法是向 ViewPager
添加滚动侦听器并获取当前项目位置并触发片段内的操作。要从 ViewPager
Adapter
中获取片段,您可以这样做:
MyFragment frag = (MyFragment) pager.getAdapter().instantiateItem(pager, position);
那么你可以调用 MyFragment
中的方法
默认情况下,Viewpager 会加载相邻的片段以确保应用流畅,这样当用户滑动到片段(已加载)时它就在那里。要更改是默认行为,请使用
viewpager.setOffscreenPageLimit(int limit)
其中 limit 是将预加载您所在的片段旁边的片段数。
希望这有帮助
您好,我正在使用 tablayout
和 viewpager
制作一个应用程序,里面有一个 fragment
和几个 child fragment
。问题是我的所有 child fragment
(来自 Tablayout
)总是执行(每当用户单击 parent fragment
时加载所有代码。如何获取child fragment
仅在用户滑动到它时加载(例如我有 2 个选项卡,选项卡 2 中的内容仅在用户滑动到选项卡 2 时加载)
这是我的parentfragment
代码
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];
}
}
}
还有我的child片段代码。我希望这些代码仅在用户滑动到 child 选项卡时执行。非常感谢任何帮助,谢谢
@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);
@Override public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
}
您可以在 ViewPager
Adapter
if(isVisibleToUser){//dosomething when the fragment is visible}
else{//dosomething else.}
请注意不要在那里初始化视图或其他任何东西,而是在 onViewCreated
中初始化您的视图并调用您想要在 setUserVisibleHint
上执行的方法。另一种丑陋的方法是向 ViewPager
添加滚动侦听器并获取当前项目位置并触发片段内的操作。要从 ViewPager
Adapter
中获取片段,您可以这样做:
MyFragment frag = (MyFragment) pager.getAdapter().instantiateItem(pager, position);
那么你可以调用 MyFragment
默认情况下,Viewpager 会加载相邻的片段以确保应用流畅,这样当用户滑动到片段(已加载)时它就在那里。要更改是默认行为,请使用
viewpager.setOffscreenPageLimit(int limit)
其中 limit 是将预加载您所在的片段旁边的片段数。
希望这有帮助