我有一个活动和 4 个可滑动的选项卡(片段(。例如,我有一个自定义 Toast 和一个 PostResponseAsyncTask 在我的片段 #3 中执行,它显示加载进度,但这个 Toast 和加载进度视图也出现在我的片段 #4 和 #2 中。我处理这个问题的正确方法是什么..
如果您根据此示例指导我完成,我将不胜感激
这是片段#3(包含吐司和执行(
public class A extends Fragment {
View view ;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.xxx_updates_layout, container, false);
PostResponseAsyncTask taskRead = new PostResponseAsyncTask(getActivity(), this);
taskRead.execute("http://symphonyrecords.6te.net/product.php");
//Custom Toast
LayoutInflater inflaterToast = getActivity().getLayoutInflater();
View layout = inflaterToast.inflate(R.layout.d_toast_d,
(ViewGroup) view.findViewById(R.id.toast_layout_root));
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_people);
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Ringtone Bank");
Toast toast = new Toast(getActivity().getApplicationContext());
toast.setGravity(Gravity.BOTTOM, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
toast.show();
return view;
} //onCreate
}
这是片段#4(不希望Toast和执行出现在这里(
public class XXXFOUR extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.xxx_four,null);
}
}
这是我的viewpager和FragmentPagerAdapter
public class XXXTabFragment extends Fragment {
public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 4 ;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View x = inflater.inflate(R.layout.xxx_tab_layout,null);
tabLayout = (TabLayout) x.findViewById(R.id.tabs);
viewPager = (ViewPager) x.findViewById(R.id.viewpager);
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
return x;
}
class MyAdapter extends FragmentPagerAdapter{
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position)
{
switch (position){
case 0 : return new XXXPrimaryFragment();
case 1 : return new XXXSocialFragment();
case 2 : return new XXXUpdatesFragment();
case 3 : return new XXXFOUR();
}
return null;
}
@Override
public int getCount() {
return int_items;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position){
case 0 :
return "Primary";
case 1 :
return "Social";
case 2 :
return "Updates";
case 3 :
return "Four";
}
return null;
}
}
}
在滑动选项卡中,这是一个常见问题,其原因是滑动时流畅的性能体验。
我建议覆盖下面的方法并管理片段是否由一个变量可见。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisible=true;
}
否则,将上述所有内容移动到一个函数中并从setUserVisibleHint
执行它。
在每个片段中使用这个
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
//Do what to perform such as toast or PostResponseAsyncTask accordingly here.
}
}
您还可以设置一个列表器,以便每次选择核心转发选项卡时,它都会根据需要触发该功能
tabLayout.setupWithViewPager(viewPager);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
selectedTabPosition = tab.getPosition();
viewPager.setCurrentItem(selectedTabPosition);
setList(selectedTabPosition);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
试试这个
public class A extends Fragment {
Toast toast;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(!isVisibleToUser){
toast.cancel();
}
}
如果您只能为文本干杯,则可以使用小吃栏
Snackbar.make(view, "Ringtone Bank", Snackbar.LENGTH_LONG).show();
显示小吃栏
当您的活动本身暂停(当您按下主页按钮时(时,Toast 有时也不会消失,但由于您正在添加带有parentView
的小吃栏,因此它只会显示在您当前的屏幕上。