2011-12-27 21 views
19

Tôi đang thêm các tab điều hướng vào thanh tác vụ bằng cách sử dụng mã mẫu được cung cấp tại đây: http://developer.android.com/guide/topics/ui/actionbar.html Tôi đang sử dụng ActionBarSherlock.Null FragmentTransaction được chuyển đến TabListener.onTabSelected()

Trình ghi tab của tôi được sao chép trực tiếp từ tài liệu.

public static class TabListener<T extends Fragment> implements ActionBar.TabListener { 
    private Fragment mFragment; 
    private final Activity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    /** Constructor used each time a new tab is created. 
     * @param activity The host Activity, used to instantiate the fragment 
     * @param tag The identifier tag for the fragment 
     * @param clz The fragment's Class, used to instantiate the fragment 
     */ 
    public TabListener(Activity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    /* The following are each of the ActionBar.TabListener callbacks */ 

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
     // Check if the fragment is already initialized 
     if (mFragment == null) { 
      // If not, instantiate and add it to the activity 
      mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      // If it exists, simply attach it in order to show it 
      ft.attach(mFragment); 
     } 
    } 

    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      // Detach the fragment, because another one is being attached 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { 
     // User selected the already selected tab. Usually do nothing. 
    } 
} 

Và tôi thiết lập người nghe trong hoạt động của tôi:

ActionBar.Tab tab = actionBar.newTab(); 
    tab.setText(getString(R.string.TAB_CALC)); 
    tab.setTabListener(new TabListener<StrokeSelectorFragment>(this, "blah", StrokeSelectorFragment.class)); 
    actionBar.addTab(tab); 

Nhưng app thổi lên với một con trỏ ngoại lệ null vì một FragmentTransaction rỗng đã được thông qua với onTabSelected() trong người nghe. Tôi có nên tạo một nơi nào đó không?

Tôi đã kết thúc tài liệu và tôi khá bối rối. Bạn có thể thấy những gì tôi đã bỏ lỡ?

+0

Mã Hoạt động mẫu trong báo cáo ActionBarSherlock lỗi này sẽ giúp: https://github.com/JakeWharton/ActionBarSherlock/pull/402 –

Trả lời

15

Điều này có vẻ là một vấn đề với thư viện tương thích (và do đó bằng cách liên kết ActionBarSherlock). Giải pháp là bỏ qua (null) FragmentTransaction được truyền vào và lấy của riêng bạn. Dưới đây là một ví dụ Mark Murphy:

 FragmentManager fragMgr = getSupportFragmentManager(); 
     FragmentTransaction ft = fragMgr.beginTransaction(); 
     ft.commit(); 

https://groups.google.com/forum/#!msg/android-developers/pCnSx7sTIZ8/cTt1L91M2NgJ

https://groups.google.com/group/actionbarsherlock/browse_thread/thread/89eac58c13fe1ae0

+0

commit() là cần thiết trong trường hợp này? Tài liệu nói "không" nhưng bạn đặt nó, tại sao? Và trong các thử nghiệm của tôi, nó chỉ hoạt động với commit(). –

16

tôi thấy bài Ollie của trên hữu ích, nhưng không đủ chi tiết. Tôi quản lý để cấu trúc lại mã được cung cấp trong ActionBar Guide như sau (lưu ý: bạn phải thực hiện thay đổi cùng với các phương pháp khác thực hiện trong TabListener):

public void onTabSelected(Tab tab, FragmentTransaction ignoredFt) { 
    FragmentManager fragMgr = ((FragmentActivity)mActivity).getSupportFragmentManager(); 
    FragmentTransaction ft = fragMgr.beginTransaction(); 

    // Check if the fragment is already initialized 
    if (mFragment == null) { 
     // If not, instantiate and add it to the activity 
     mFragment = Fragment.instantiate(mActivity, mClass.getName()); 

     ft.add(android.R.id.content, mFragment, mTag); 
    } else { 
     // If it exists, simply attach it in order to show it 
     ft.attach(mFragment); 
    } 
} 
+3

Cảm ơn vì điều này. Điều thú vị là, lúc đầu, tôi đã bỏ qua việc thêm cuộc gọi ft.commit mà không có hậu quả rõ ràng. –

+0

Chúc mừng @Boswell, tôi đã bỏ lỡ điều đó và chỉ phát hiện ra nó nhờ nhận xét của bạn – Dan2552

+0

Tốt hơn câu trả lời ở trên. –

1

Đó là lỗi tại ActionBarSherlock. Sửa lỗi bởi JakeWharton trong phiên bản 4.0.1 (2012-03-25).

Now ActionBarSherlock hoạt động chính xác.

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