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

时间:2018-01-31 14:44:05

标签: android android-fragments android-viewpager android-tablayout

我在fragments

中的ViewPager中有2个标签Activity

当我点击布局中的第二个标签时,OnTabUnselected方法有效。

但是,当我屏幕从一个标签滑动到另一个标签时,该方法不会被调用。

我如何通过两种方式实现这种方法调用"点击以及滑动手势"

我的活动课程是:

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

}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以使用ViewPager.addOnPageChangeListener()方法注册听众,并通过寻呼机滑动获得有关更改当前标签的通知。

有一个非常好的教程here