2017-02-03 4 views
0

У меня есть TabLayout с тремя вкладками, каждая вкладка имеет свой собственный фрагмент (отводящий классы и разные защитный тип фрагментов.Как заменить фрагмент в TabLayout в Android

public Fragment getItem(int position){ 
    switch (position){ 
     case 0: 
      BooksFragment tabBooks = new BooksFragment(); 
      return tabBooks; 
     case 1: 
      NavigationFragment tabNav = new NavigationFragment(); 
      return tabNav; 
     case 2: 
      SearchFragment tabSearch = new SearchFragment(); 
      return tabSearch; 
     default: 
      return null; 
    } 
} 

В tabBooks я есть таблица с книги, и когда кто-то щелкает книгу, мне нужно открыть главы. (Это работает, чтобы получить главы из веб-страницы и заполнить таблицу в фрагменте главы). Для этого у меня есть фрагмент главы.

I ' m, вероятно, делает что-то очень неправильное здесь: (В BooksFragment - onListItemClick):

fm.beginTransaction().replace(R.id.main_layout, new ChapterFragment()).commit(); 

фм является FragmentManager:

FragmentManager fm = getFragmentManager(); 

В результате я получаю фрагмент поверх всех остальных фрагментов, и он остается на вершине всего, когда я переключения вкладок.

Я знаю, что это неправильно, и таким образом я не имеют функциональные кнопки назад и кнопка назад вернется на главный экран, а не государство пред (фрагмент) я был.

I просто не могу найти решение для этого.

Im используя

FragmentPagerAdapter

Но я предполагаю, что это не проблема, проблема с

R.id.main_layout

в сообщении fm.beginTransaction или о том, что i Я использую его в FragmentManager. но я не могу найти правильный способ сделать это

Опять же, вы ищете способ изменить фрагмент в TabLayout только для конкретной вкладки.

  1. В этом же разделе, как мне вернуться к первому фрагменту, когда кто-то нажимает кнопку «Назад» или нажимает кнопку «Назад», которая у меня есть в моей панели инструментов (Опять же, в та же вкладка).

Я сижу на этом конкретном действии в течение 2 дней и не могу найти решение.

страница Адаптер Я использую в MainActivity (Моя единственная деятельность):

public class PageAdapter extends FragmentPagerAdapter { 
int mNumOfTabs; 

public PageAdapter(FragmentManager fm, int mNumOfTabs) { 
    super(fm); 
    this.mNumOfTabs = mNumOfTabs; 
} 

@Override 
public Fragment getItem(int position){ 
    switch (position){ 
     case 0: 
      BooksFragment tabBooks = new BooksFragment(); 
      return tabBooks; 
     case 1: 
      NavigationFragment tabNav = new NavigationFragment(); 
      return tabNav; 
     case 2: 
      SearchFragment tabSearch = new SearchFragment(); 
      return tabSearch; 
     default: 
      return null; 
    } 
} 

@Override 
public int getCount(){ 
    return mNumOfTabs; 
} 

}

Основная деятельность:

public ViewPager pager; 
PagerAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
    tabLayout.addTab(tabLayout.newTab().setText("ספרים")); 
    tabLayout.addTab(tabLayout.newTab().setText(R.string.navigation_title)); 
    tabLayout.addTab(tabLayout.newTab().setText(R.string.search_title)); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

    pager = (ViewPager) findViewById(R.id.pager); 
    adapter = new PageAdapter(getSupportFragmentManager(), tabLayout.getTabCount()); 
    pager.setAdapter(adapter); 
    pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){ 
     @Override 
     public void onTabSelected(TabLayout.Tab tab){ 
      pager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab){} 

     @Override 
     public void onTabReselected(TabLayout.Tab tab){} 
    }); 
} 

книги Фрагмент:

@Override 
public void onListItemClick(ListView l, View v, int position, long id){ 
    super.onListItemClick(l, v, position, id); 

    switch (displayType) { 
     case CATEGORIES: 
      Category cat = (Category) l.getItemAtPosition(position); 
      books = cat.getBooks(); 
      updateDisplay(ItemType.BOOKS); 
      displayType = ItemType.BOOKS; 
      break; 
     case BOOKS: 
      Book book = (Book) l.getItemAtPosition(position); 
      FragmentManager fm = getFragmentManager(); 
      fm.beginTransaction().replace(R.id.main_layout, new ChapterFragment()).commit(); 
      break; 
    } 
} 

Thanks

+0

Вы хотите заменить 'tabFragment' на' chapterFragment' двумя другими вкладками, все еще неповрежденными? –

+0

Можете ли вы опубликовать свой код класса, расширяющий 'FragmentPagerAdapter', а также код, связанный с настройкой' Viewpager'. –

+0

Я обновил все соответствующие коды, я думаю – Erez

ответ

1

Попробуйте использовать childFragmentManager, как показано ниже, вместо поддержкиFragmentManager.

@Override 
public void onListItemClick(ListView l, View v, int position, long id){ 
    super.onListItemClick(l, v, position, id); 

    switch (displayType) { 
     case CATEGORIES: 
      Category cat = (Category) l.getItemAtPosition(position); 
      books = cat.getBooks(); 
      updateDisplay(ItemType.BOOKS); 
      displayType = ItemType.BOOKS; 
      break; 
     case BOOKS: 
      Book book = (Book) l.getItemAtPosition(position); 
      //change this 
      //FragmentManager fm = getFragmentManager(); 
      FragmentManager fm = getChildFragmentManager(); 
      fm.beginTransaction().replace(R.id.main_layout, new ChapterFragment()).commit(); 
      break; 
    } 
+0

10x, Это правильное направление, вместо этого я использую TabPageIndicator. следуя инструкциям, разрешил мне backPress также и все работает, за исключением того, что я потерял свой ToolBar, но я исправлю это ... но это правильный ответ, 10x – Erez

Смежные вопросы