2015-11-22 3 views
3

ПроблемныхВложенные фрагменты в 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: извините за мой плохой английский.

ответ

0

Ответить здесь https://tausiq.wordpress.com/2014/06/06/android-multiple-fragments-stack-in-each-viewpager-tab/ (В этом случае используется библиотека viewpagerindicator, но ее можно легко заменить tablayout).

Основная идея: создать фрагмент корня, а в этом фрагменте поместить ваш viewpager, tablayout и другие фрагменты. Все работает нормально.

1

если я действительно понимаю, вы, вероятно, и ваша единственная проблема теперь, что опция меню не является отображением, вероятно, вы могли бы сделать это

pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){ 
     @Override public void onPageSelected(int position) { 
      supportInvalidateOptionsMenu(); 
     } 
    }); 

это re-invalidate перехода по меню каждый раз, когда вы выбираете страницу в fragment и вы можете сделать то же самое каждый раз, когда вы замените fragment по телефону

((getActivity())AppCompatActivity).supportInvalidateOptionsMenu(); 

, который аннулирует меню на каждый заменен fragment.

+0

Спасибо за ответ, я попробовал это, но также вызвал неправильный метод onOptionsItemSelected. –

+0

не могли бы вы объяснить больше, вызвав неправильный onOptionItemSelected?потому что, если ваше меню находится в вложенномфрагменте, вам придется реализовать onOptionsItemSelected во вложенном фрагменте, а не в действии – k0sh

+0

Извините за ожидание, я имел в виду, что когда в viewpager выбран фрагмент2, называемый onOptionsItemSelected из фрагмента1. –