从一个片段滑动到另一个片段时调用方法

Call a method when sliding from one fragment to another

我有 2 个选项卡作为 fragmentsViewPagerActivity

当我点击布局中的第二个选项卡时,OnTabUnselected 方法有效。

但是,当我将屏幕从一个选项卡滑动到另一个选项卡时,不会调用该方法。

如何通过两种方式实现这种方法的调用"Tapping as well as in a Sliding Gesture"

我的Activityclass是:

public class OrderActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private FloatingActionButton printAction;
    ViewPagerAdapter adapter;
    private Boolean exit = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_icon_text_tabs);

        TypefaceUtil.overrideFont(getApplicationContext(), "serif", "fonts/opensans.tff");
        //TypefaceUtil.overrideFont(getApplicationContext(), "arial", "fonts/opensans.tff");

        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        //setupTabIcons();
        printAction = (FloatingActionButton) findViewById(R.id.float_print); 

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                Toast.makeText(getApplicationContext(),"onTabSelected",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                String ac = null;
                int pos = viewPager.getCurrentItem();
                Fragment activeFragment = adapter.getItem(pos);
                if(pos==0){
                   ac=  ((PersonalDetailFragment)activeFragment).getXmlValue();
                }

                Toast.makeText(getApplicationContext(),ac,Toast.LENGTH_LONG).show();
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                Toast.makeText(getApplicationContext(),"onTabReselected",Toast.LENGTH_LONG).show();
            }
        });


    }


    private void setupViewPager(ViewPager viewPager) {
        adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new PersonalDetailFragment(), "Personal");
        adapter.addFrag(new OrderItemsFragment(), "Invoice");
        viewPager.setAdapter(adapter);
    }



    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

}

片段 A:

 public class FragmentA extends Fragment {

        private EditText custName; 
        public PersonalDetailFragment() {
            // Required empty public constructor
        }

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

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment

            View view = inflater.inflate(R.layout.personal_detail_fragment, container, false); 
            custName = (EditText) view.findViewById(R.id.customerContactEditText); 

            return view;
        }  


public String getXmlValue(){

        return custName.getText().toString();
    }

    }

片段 B:

public class FragmentB extends Fragment {

    private EditText contactNo; 
    public PersonalDetailFragment() {
        // Required empty public constructor
    }

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.personal_detail_fragment, container, false); 
        contactNo = (EditText) view.findViewById(R.id.customerContactEditText); 

        return view;
    }  

}

在您的片段中,您可以使用名为 setVisibilityHint 的方法,每次片段的可见性更改时都会调用该方法。有一个布尔参数可以是 truefalse 取决于片段是否可见

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    }

您可以使用 ViewPager.addOnPageChangeListener() 方法注册一个侦听器,并通过寻呼机滑动来获得有关更改当前选项卡的通知。

有一个非常好的教程here