ПроблемныхВложенные фрагменты в ViewPager с различным меню
Я хочу создать ViewPager с 2 фрагментами в одной деятельности. Эти фрагменты имеют различные варианты меню, и один фрагмент вложенная - нажав пункт ListView, открывается тот же фрагмент с новыми данными (replace(), addToBackStack()
), но ViewPager не правильно заменить (когда я transaction.replace(R.id.viewpager, new TwoFragment())
Я использовал этот ответ. - https://stackoverflow.com/a/18020219/5576117, но у меня есть различные варианты меню и опции меню завышены из фрагмента контейнера
в результате, если я создаю новый фрагмент (как контейнер), я просто передать булеву дополнительные isContainer
фрагментировать и это работает но теперь.. вызов активности неправильный onOptionsItemSelected метод (вызов от fragment2
, когда в viewpager выбрано fragment1
).
Мой код
MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.addOnPageChangeListener(this);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
viewPager.setOffscreenPageLimit(2);
mAdapter = new MainViewPagerAdapter(getSupportFragmentManager());
TwoFragment fragment = new TwoFragment();
Bundle args = new Bundle(1);
args.putBoolean(TwoFragment.ISCONTAINER_EXTRA, true);
fragment.setArguments(args);
mAdapter.addFragment(fragment, "TAB1");
mAdapter.addFragment(new OneFragment(), "TAB2");
}
OneFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
setHasOptionsMenu(true);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.menu_one, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// This method not called then this fragment selected in viewpager
return true;
}
TwoFragment:
@Override
public void onCreate(Bundle savedInstanceState) {
Bundle extras = getArguments();
if (extras != null && extras.containsKey(ISCONTAINER_EXTRA)) {
isContainer = extras.getBoolean(ISCONTAINER_EXTRA);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (isContainer) {
setHasOptionsMenu(false);
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.replace(R.id.clRoot, new TwoFragment()).commit();
return inflater.inflate(R.layout.fragment_two, container, false);
}
View view = inflater.inflate(R.layout.fragment_two, container, false);
setHasOptionsMenu(true);
// Other actions
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.menu_two, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// This method called then always
switch (item.getItemId()) {
case android.R.id.home:
getFragmentManager().popBackStack();
break;
case R.id.action_settings:
startActivity(new Intent(getActivity(), SettingsActivity.class));
break;
case R.id.action_exit:
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(homeIntent);
break;
}
return true;
}
Вопрос
Как я могу сделать это без использования сторонних библиотек?
P.S: извините за мой плохой английский.
Спасибо за ответ, я попробовал это, но также вызвал неправильный метод onOptionsItemSelected. –
не могли бы вы объяснить больше, вызвав неправильный onOptionItemSelected?потому что, если ваше меню находится в вложенномфрагменте, вам придется реализовать onOptionsItemSelected во вложенном фрагменте, а не в действии – k0sh
Извините за ожидание, я имел в виду, что когда в viewpager выбран фрагмент2, называемый onOptionsItemSelected из фрагмента1. –