我有一个Activity
,它持有一个主Fragment
,然后包含一个ViewPager
和TabLayout
。我已经在我的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);
}
答案 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;
}