2012-10-03 32 views
10

Estoy usando un viewpager "pestañas + deslizar" y me gustaría establecer diferentes títulos en la barra de acciones para cada fragmento para que cuando cambie, el título cambie.Diferentes títulos para cada fragmento en mi viewpager

He intentado varias cosas sin éxito, sólo los últimos pantallas de título ... y ya no cambia cuando cambio ...

Respuesta

29

En primer lugar, hacer que su actividad implementar un OnPageChangeListener.

Luego, cuando crea su ViewPager, puede usar mViewPager.setOnPageChangeListener(this) para que su actividad reciba devoluciones de llamada cuando la página cambie.

Por último, es necesario implementar las OnPageChangeListener devoluciones de llamada. Su método onPageSelected() debe ser algo como esto:

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

Los otros dos devoluciones de llamada pueden estar vacíos.

+0

Muy bien, gracias !! – lost17

+0

¡Hermosa respuesta! :) –

3

Aunque la pregunta es un poco anticuado sugeriría mi solución. Escenario: pestañas + deslizar y cada pestaña tiene una pila de navegación de fragmentos. Por lo tanto, el título de la barra de acciones se puede cambiar no solo al cambiar y deslizar las pestañas, sino también con la navegación en cada pestaña. Para proporcionar el título por fragmento declaré TitleProvider interfaz, por lo que si el fragmento tiene título personalizado debe implementar esta interfaz.

public interface TitleProvider { 
    CharSequence getTitle(); 
} 

A continuación se presenta la costumbre FragmentPagerAdapter, que se encarga de conmutación, deslizar, la navegación y la actualización del título:

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

Usted puede hacer que sea así "es fácil ¿verdad?"

Cuestiones relacionadas