如何避免在选项卡滑动上的侧面片段中调用onCreateView



我有一个活动和 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小吃栏,因此它只会显示在您当前的屏幕上。

最新更新