当viewPager位于主片段中时,如何从Main Activity中更改viewPager的位置

时间:2019-02-23 13:15:54

标签: android android-fragments android-viewpager

我有一个Activity,它持有一个主Fragment,然后包含一个ViewPagerTabLayout。我已经在我的NavigationDrawer中实现了MainActivity,并且想在用户单击viewPager.setCurrentItem中的项目时更改NavigationDrawer

如何将数据从NavigationDrawer中的MainActivity传递到ViewPager中的Fragment

主要活动:

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        //TODO: handle the item clicks in navDrawer
        switch (menuItem.getItemId()) {
            case R.id.nav_home:
                // Here I want to call viewPager.setCurrentItem(0), but I cannot call this from here. 
                Toast.makeText(NITrafficActivity.this, "Home!", Toast.LENGTH_SHORT).show();
                break;
            case R.id.nav_cctv:
                Toast.makeText(NITrafficActivity.this, "CCTV Cameras", Toast.LENGTH_SHORT).show();
                break;
            case R.id.nav_future_roadworks:
                Toast.makeText(NITrafficActivity.this, "Future Roadworks", Toast.LENGTH_SHORT).show();
                break;
            case R.id.nav_journey_times:
                Toast.makeText(NITrafficActivity.this, "Journey Times", Toast.LENGTH_SHORT).show();
                break;
            case R.id.nav_speed_cameras:
                Toast.makeText(NITrafficActivity.this, "Speed Cameras", Toast.LENGTH_SHORT).show();
                break;
        }
        menuItem.setChecked(true);
        drawerLayout.closeDrawers();
        return true;
    }

主要片段:

public class TrafficTabsFragment extends Fragment implements OnBackPressedHandler {

    private MyViewModel viewModel;
    private SearchView searchView;
    private TabLayout tabLayout;
    private ViewPager viewPager;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        viewModel = ViewModelProviders.of(requireActivity()).get(MyViewModel.class);
    }

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

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        final List<Pair<String, Fragment>> tabs = CollectionsKt.arrayListOf(
                new Pair<String, Fragment>(getString(R.string.roadworks, 0), RoadworksFeedFragment.newInstance()),
                new Pair<String, Fragment>(getString(R.string.incidents, 0), IncidentsFeedFragment.newInstance())
        );

        tabLayout = view.findViewById(R.id.main_tab_layout);
        viewPager = view.findViewById(R.id.main_view_pager);

        viewPager.setAdapter(new TrafficTabsAdapter(getChildFragmentManager(), tabs));
        tabLayout.setupWithViewPager(viewPager);

        monitorFilterCount(viewModel.roadworksFilterCount, 0, R.string.roadworks);
        monitorFilterCount(viewModel.incidentsFilterCount, 1, R.string.incidents);
    }

1 个答案:

答案 0 :(得分:0)

您可以将位置传递给参考片段。 在您的TrafficTabsFragment内部,添加此方法。

public void changeItem(int position){
    viewPager.setCurrentItem(position,true);
}

在onNavigationItemSelected回调内部,调用带有位置参数的changeItem方法。

 @Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    //TODO: handle the item clicks in navDrawer
    switch (menuItem.getItemId()) {
        case R.id.nav_home:
            //call it here
            trafficTabFragment.changeItem(0);
            break;
        case R.id.nav_cctv:
            trafficTabFragment.changeItem(1);
            break;
        case R.id.nav_future_roadworks:
            trafficTabFragment.changeItem(2);
            break;
        case R.id.nav_journey_times:
            trafficTabFragment.changeItem(3);
            break;
        case R.id.nav_speed_cameras:
            trafficTabFragment.changeItem(4);
            break;
    }
    menuItem.setChecked(true);
    drawerLayout.closeDrawers();
    return true;
}