2012-10-01 63 views
6

Tôi đang gặp phải một vấn đề liên quan đến thao tác vuốt tab. Dự án của tôi được xây dựng trên Android 3.2. Tôi đang thực hiện thao tác vuốt tab bằng thư viện hỗ trợ 4.0 (android-support-v4.jar). Mọi thứ được triển khai đều hoạt động tốt nhưng khi tôi triển khai ứng dụng của mình sang thiết bị ICS, sau đó ở chế độ dọc, tôi nhận được thanh xoay trong thanh tác vụ để chọn tab. Ở chế độ dọc, lựa chọn tab không thay đổi khi vuốt được thực hiện mặc dù nội dung đang thay đổi và mọi thứ hoạt động tốt ở chế độ ngang.Cách hiển thị đoạn đã chọn trong tab thanh tác vụ

final ActionBar actionBar = getActionBar(); 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
actionBar.setDisplayHomeAsUpEnabled(true); 
// Set up the ViewPager with the sections adapter. 
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); 

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 
     actionBar.setSelectedNavigationItem(position); 
    } 

}); 

Tôi đã thử đặt điểm ngắt actionBar.setSelectedNavigationItem(position); trên dòng này và thậm chí ở chế độ dọc mà nó được gọi nhưng lựa chọn không thay đổi.

Ai đó có thể trợ giúp việc này?

EDITED: Tìm thấy một similar problem nhưng không thấy chính xác làm thế nào nó được giải quyết và làm thế nào để tích hợp nó trong mã của tôi.

+0

Tôi nghĩ rằng công trình này trong mẫu của tôi: https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/TabPager Tuy nhiên, tôi sẽ khuyên bạn nên xem xét chuyển từ tab thanh tác vụ sang 'PagerTabStrip' hoặc tab của ViewPagerIndicator, cho các tab nhất quán trên các định hướng: https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/Indicator – CommonsWare

+0

Cảm ơn bạn đã trả lời, tôi sẽ xem các liên kết và tôi chỉ cần sử dụng tính năng vuốt tab nhưng cảm ơn đề xuất. Tôi sẽ thử triển khai PagerTabStripe và xem điều này có tốt hơn không. – Android

Trả lời

16

Sự cố: Do nền tảng thực tế thiếu nền tảng sử dụng điều hướng thu gọn (tức là Spinner). Hệ thống tự động xác định NAVIGATION_MODE_TABS cho khung cảnh & NAVIGATION_MODE_LIST cho ảnh chân dung, thay đổi hướng từ ngang sang chân dung cập nhật giao diện người dùng nhưng vì một số lý do không cập nhật thuộc tính chế độ điều hướng thành NAVIGATION_MODE_LIST và do đó mActionView.setDropdownSelectedPosition (vị trí) không được gọi. Xem đoạn mã sau của ActionBarImpl: setSelectedNavigationItem

public void setSelectedNavigationItem(int position) { 
    switch (mActionView.getNavigationMode()) { 
    case NAVIGATION_MODE_TABS: 
     selectTab(mTabs.get(position)); 
     break; 
    case NAVIGATION_MODE_LIST: 
     mActionView.setDropdownSelectedPosition(position); 
     break; 
    default: 
     throw new IllegalStateException(
       "setSelectedNavigationIndex not valid for current navigation mode"); 
    } 
} 

giải pháp giải quyết: Qua phản ánh, chúng tôi có thể nhận được các đối tượng spinner tab và gọi phương thức setSelection.

private Spinner getTabSpinner() 
{ 
    try 
    { 
     int id = getResources().getIdentifier("action_bar", "id", "android"); 
     View actionBarView = findViewById(id); 

     Class<?> actionBarViewClass = actionBarView.getClass(); 
     Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView"); 
     mTabScrollViewField.setAccessible(true); 

     Object mTabScrollView = mTabScrollViewField.get(actionBarView); 
     if (mTabScrollView == null) { 
      return null; 
     } 

     Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner"); 
     mTabSpinnerField.setAccessible(true); 

     Object mTabSpinner = mTabSpinnerField.get(mTabScrollView); 
     if (mTabSpinner != null) 
     { 
      return (Spinner)mTabSpinner; 
     } 
    } 
    catch (Exception e) { 
     return null; 
    } 

    return null; 
} 

Sau đó gọi phương thức trên trong sự kiện onPageSelected.

 public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
      Spinner spinner = getTabSpinner(); 
      if (spinner != null) { 
       spinner.setSelection(position); 
      } 
     } 

giới thiệu bài này https://gist.github.com/2657485

+0

Rất nhiều thxx Wayofhope. Tôi sẽ đi qua ví dụ của bạn và cho bạn biết tiến trình. – Android

+0

Xin cảm ơn Way of Hope. Nó làm việc rực rỡ. Giải quyết của tôi 5 ngày vấn đề. Nhờ một lần nữa. – Android

+0

Tuyệt vời !!! Hãy tận hưởng bạn thân. –

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