2012-10-03 19 views
10

Tôi đang sử dụng một thẻ "tab + swipe" và tôi muốn đặt tiêu đề khác nhau trong actionBar cho từng đoạn để khi tôi chuyển đổi, tiêu đề thay đổi.Các tiêu đề khác nhau cho mỗi đoạn trong viewpager của tôi

Tôi đã thử nhiều thứ nhưng không thành công, chỉ hiển thị tiêu đề cuối cùng ... và không thay đổi nữa khi tôi chuyển sang ...

Trả lời

29

Trước tiên, hãy hoạt động của bạn thực hiện một OnPageChangeListener.

Sau đó, khi bạn tạo ViewPager, bạn có thể sử dụng mViewPager.setOnPageChangeListener(this) để hoạt động của bạn sẽ nhận được cuộc gọi lại khi trang thay đổi.

Cuối cùng, bạn cần triển khai các cuộc gọi lại OnPageChangeListener. Phương thức onPageSelected() của bạn phải như sau:

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

Hai callbacks còn lại có thể trống.

+0

Tuyệt vời, cảm ơn !! – lost17

+0

Câu trả lời đáng yêu! :) –

3

Mặc dù câu hỏi là một chút lỗi thời, tôi sẽ đề xuất giải pháp của tôi. Kịch bản: tab + vuốt và mọi tab đều có ngăn điều hướng phân đoạn. Vì vậy, tiêu đề thanh hành động có thể được thay đổi không chỉ thông qua chuyển đổi và vuốt tab nhưng với điều hướng trong mỗi tab. Để cung cấp tiêu đề cho mỗi đoạn, tôi đã tuyên bố giao diện TitleProvider, vì vậy nếu đoạn có tiêu đề tùy chỉnh, nó phải triển khai giao diện này.

public interface TitleProvider { 
    CharSequence getTitle(); 
} 

Dưới đây có tùy chỉnh là FragmentPagerAdapter, để xử lý chuyển mạch, trượt, chuyển hướng và cập nhật tiêu đề:

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

Bạn có thể làm cho nó như thế này "thật dễ dàng phải không?"

Các vấn đề liên quan