2012-10-03 19 views
10

Sto usando un viewpager "tabs + swipe" e vorrei impostare diversi titoli nella actionBar per ogni frammento in modo che quando cambio, il titolo cambia.Titoli diversi per ogni frammento nel mio viewpager

Ho provato diverse cose senza successo, solo le ultime esposizioni titolo ... e non cambia più quando passo ...

risposta

29

In primo luogo, rendere la vostra attività di implementare una OnPageChangeListener.

Quindi, quando si crea il ViewPager, è possibile utilizzare mViewPager.setOnPageChangeListener(this) in modo che l'attività riceva le richiamate quando la pagina cambia.

Infine, è necessario implementare i callback OnPageChangeListener. Il tuo metodo onPageSelected() dovrebbe essere qualcosa di simile:

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

Le altre due callback possono essere vuoti.

+0

Ottimo, grazie !! – lost17

+0

Bella risposta! :) –

3

Anche se la domanda è un po 'obsoleta suggerirei la mia soluzione. Scenario: schede + scorrimento e ogni scheda contiene lo stack di navigazione dei frammenti. Pertanto, il titolo della barra delle azioni può essere modificato non solo tramite la commutazione e lo scorrimento delle schede ma con la navigazione in ogni scheda. Per fornire il titolo per frammento ho dichiarato l'interfaccia TitleProvider, quindi se il frammento ha un titolo personalizzato deve implementare questa interfaccia.

public interface TitleProvider { 
    CharSequence getTitle(); 
} 

Di seguito è personalizzato FragmentPagerAdapter, che gestisce la commutazione, strisciata, navigazione e aggiornamento del titolo:

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); 
      } 

si può fare in questo modo "è facile vero?"

Problemi correlati