2012-10-03 53 views
10

我正在使用viewpager「標籤+刷卡」,我想在每個片段的actionBar中設置不同的標題,以便在切換標題時更改標題。我的viewpager中的每個片段的不同標題

我試過幾件事情沒有成功,只有最後一個標題顯示......當我切換不會再改變...

回答

29

首先,讓您的活動實施OnPageChangeListener

然後,當您創建ViewPager時,可以使用mViewPager.setOnPageChangeListener(this),以便您的活動在頁面更改時收到回調。

最後,您需要實施OnPageChangeListener回調。你onPageSelected()方法應該是這樣的:

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

其他兩個回調可以是空的。

+0

太好了,謝謝! – lost17

+0

可愛的答案! :) –

3

雖然問題有點過時,我會建議我的解決方案。場景:標籤+滑動,每個標籤都有片段導航堆棧。因此,操作欄標題不僅可以通過切換和滑動標籤進行更改,還可以在每個標籤中進行導航。爲了提供每個片段的標題,我聲明瞭TitleProvider接口,因此如果片段具有自定義標題,它必須實現此接口。

public interface TitleProvider { 
    CharSequence getTitle(); 
} 

下面有風俗FragmentPagerAdapter,即處理切換,滑動,導航和標題更新:

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

你可以把它像這樣的 「很容易吧?」