片段将视图返回到其他片段

时间:2017-02-07 06:21:49

标签: android android-fragments fragment

我有四个Fragment s(标签滑动内容)。例如,我在Toast#2中创建了Fragment,但是当我打开它时,这个吐司也出现在我的Fragment#4中。 这里缺少什么。

这是我的片段#2

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);

    //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

public class XXXSentFragment extends Fragment {

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

我的片段寻呼机适配器

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;
       }
   }

}

1 个答案:

答案 0 :(得分:1)

问题是View View一次加载3个片段(显示的是一个片段,左边的片段和右边的片段)。因此,onCreateView会立即调用所有它们,这就是为什么来自另一个片段的toast出现的原因。在onCreateView中为所有片段添加一个日志语句来验证这一点,并更好地理解它是如何工作的。

如果您的用例是在用户滑动或选择某个片段时显示吐司(在您的情况下为XXXUpdatesFragment()),那么解决此问题的一种方法是在FragmentPagerAdapter中保留对片段的引用,然后实现viewPager上的onPageChangeListener,当页面变为2时,使用引用调用XXXUpdatesFragment()中的方法,该方法将显示一个toast。

public class XXXUpdatesFragment 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);


    return view;
   } 

  public void showToast() {
    //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();
  }
}