2012-10-03 17 views
10

Używam "tabs + swipe" strony podglądu i chciałbym ustawić różne tytuły w actionBar dla każdego fragmentu, tak aby po zmianie, tytuł zmienił się.Różne tytuły dla każdego fragmentu w moim viewpager

Próbowałem kilka rzeczy, bez powodzenia, tylko ostatni tytuł wyświetlacze ... i nie zmienia się już po zmianie ...

Odpowiedz

29

Po pierwsze, sprawdź swoją aktywność wdrożyć OnPageChangeListener.

Następnie, po utworzeniu numeru ViewPager można użyć numeru mViewPager.setOnPageChangeListener(this), dzięki czemu aktywność będzie otrzymywać oddzwonienia po zmianie strony.

Wreszcie, należy wykonać wywołania zwrotne OnPageChangeListener. Twoja metoda onPageSelected() powinno być coś takiego:

@Override 
public abstract void onPageSelected(int position) { 
    setTitle(getTitleFromPosition(position)); 
} 

Pozostałe dwa wywołania zwrotne może być pusta.

+0

Świetne, dzięki !! – lost17

+0

Urocza odpowiedź! :) –

3

Chociaż pytanie jest nieco nieaktualne, sugerowałbym moje rozwiązanie. Scenariusz: karty + przeciągnięcie i każda karta ma stos nawigacji po fragmentach. Tytuł paska akcji można zmienić nie tylko poprzez przełączanie i przesuwanie kart, ale także nawigację w każdej zakładce. Aby podać tytuł na fragment, zadeklarowałem interfejs TitleProvider, więc jeśli fragment ma niestandardowy tytuł, musi zaimplementować ten interfejs.

public interface TitleProvider { 
    CharSequence getTitle(); 
} 

Poniżej znajduje zwyczaj FragmentPagerAdapter, który obsługuje przełączania, przesuwając, nawigacji i tytuł aktualizacji:

public class TabsAdapter extends FragmentPagerAdapter implements 
     TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener { 
    private final FragmentActivity activity; 
    private final TabHost tabHost; 
    private final ViewPager viewPager; 
    private final ArrayList<Fragment> fragments = new ArrayList<Fragment>(); 
    private final Hashtable<Fragment, Stack<Class<?>>> fragmentBackstack = new Hashtable<Fragment, Stack<Class<?>>>(); 

    static class DummyTabFactory implements TabHost.TabContentFactory { 
     private final Context context; 

     public DummyTabFactory(Context context) { 
      this.context = context; 
     } 

     @Override 
     public View createTabContent(String tag) { 
      View v = new View(context); 
      v.setMinimumWidth(0); 
      v.setMinimumHeight(0); 
      return v; 
     } 
    } 

    public TabsAdapter(FragmentActivity activity, TabHost tabHost, 
         ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     this.activity = activity; 
     this.tabHost = tabHost; 
     viewPager = pager; 
     tabHost.setOnTabChangedListener(this); 
     viewPager.setAdapter(this); 
     viewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(String tag, int drawableId, Fragment fragment, 
         int tabIndicatorId) { 
     TabSpec tabSpec = tabHost.newTabSpec(tag); 
     tabSpec.setContent(new DummyTabFactory(activity.getApplicationContext())); 

     View tabIndicator = LayoutInflater.from(
       activity.getApplicationContext()).inflate(tabIndicatorId, 
       tabHost.getTabWidget(), false); 
     TextView title = (TextView) tabIndicator.findViewById(R.id.tab_title); 

     if (fragment instanceof TitleProvider) { 
      title.setText(((TitleProvider) fragment).getTitle()); 
     } 

     ImageView icon = (ImageView) tabIndicator.findViewById(R.id.tab_icon); 
     icon.setImageResource(drawableId); 

     tabSpec.setIndicator(tabIndicator); 

     fragments.add(fragment); 
     tabHost.addTab(tabSpec); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return fragments.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragments.get(position); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     int returnCode; 
     if (fragments.contains(object)) { 
      returnCode = POSITION_UNCHANGED; 
     } else { 
      returnCode = POSITION_NONE; 
     } 
     return returnCode; 
    } 

    @Override 
    public void onTabChanged(String tabId) { 
     int position = tabHost.getCurrentTab(); 
     viewPager.setCurrentItem(position); 
     updateTitle(); 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, 
           int positionOffsetPixels) { 
    } 

    @Override 
    public void onPageSelected(int position) { 
     // Unfortunately when TabHost changes the current tab, it kindly 
     // also takes care of putting focus on it when not in touch mode. 
     // The jerk. 
     // This hack tries to prevent this from pulling focus out of our 
     // ViewPager. 
     TabWidget widget = tabHost.getTabWidget(); 
     int oldFocusability = widget.getDescendantFocusability(); 
     widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
     tabHost.setCurrentTab(position); 
     widget.setDescendantFocusability(oldFocusability); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 

    public void navigate(Fragment fromFragment, Fragment toFragment) { 
     startUpdate(viewPager); 

     FragmentTransaction transaction = activity.getSupportFragmentManager() 
       .beginTransaction(); 
     transaction.remove(fromFragment); 
     transaction.commit(); 

     Stack<Class<?>> backstack; 
     if (fragmentBackstack.containsKey(fromFragment)) { 
      backstack = fragmentBackstack.get(fromFragment); 
      fragmentBackstack.remove(fromFragment); 
     } else { 
      backstack = new Stack<Class<?>>(); 
     } 
     backstack.push(fromFragment.getClass()); 
     fragmentBackstack.put(toFragment, backstack); 

     fragments.set(fragments.indexOf(fromFragment), toFragment); 
     finishUpdate(viewPager); 
     notifyDataSetChanged(); 
     updateTitle(); 
    } 

    public Boolean navigateBack() { 
     startUpdate(viewPager); 
     Fragment fromFragment = fragments.get(viewPager.getCurrentItem()); 

     if (!fragmentBackstack.containsKey(fromFragment)) 
      return false; 
     Stack<Class<?>> backstack = fragmentBackstack.get(fromFragment); 
     if (backstack.isEmpty()) 
      return false; 

     fragmentBackstack.remove(fromFragment); 
     Fragment toFragment = Fragment.instantiate(activity, backstack.pop() 
       .getName()); 
     fragmentBackstack.put(toFragment, backstack); 

     fragments.set(fragments.indexOf(fromFragment), toFragment); 

     FragmentTransaction transaction = activity.getSupportFragmentManager() 
       .beginTransaction(); 
     transaction.remove(fromFragment); 
     transaction.commit(); 

     finishUpdate(viewPager); 
     notifyDataSetChanged(); 
     updateTitle(); 
     return true; 
    } 

    protected Fragment getCurrentFragment() { 
     return fragments.get(viewPager.getCurrentItem()); 
    } 

    protected void updateTitle() { 
     Fragment fragment = getCurrentFragment(); 
     if (fragment instanceof TitleProvider) { 
      activity.setTitle(((TitleProvider) fragment).getTitle()); 
     } 
    } 
} 
0
@Override 
     public void onPageSelected(int position) { 
      tabHost.setSelectedNavigationItem(position); 
      if (position == 0){ 
       setTitle(R.string.where_is_the_bus); 
      } 
      else if (position == 1){ 
       setTitle(R.string.bus_card); 
      } 
      else if (position == 2){ 
       setTitle(R.string.favo); 
      } 

można zrobić to w ten sposób "to proste prawda?"

Powiązane problemy