2011-11-06 14 views
10

Tôi đang cố gắng lấy mã here để hoạt động. Nó biên dịch tốt. Nó sẽ chạy. Và nó sẽ tải tab 1 (của 3). Tuy nhiên, khi tôi bấm vào tab thứ 2 hoặc thứ 3, tôi có được điều này:FragmentTransaction .attach và .detach cho các tab Actionbar

java.lang.NoSuchMethodError: android.app.FragmentTransaction.detach

điều này xảy ra trong các mã ở đây

public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    if (mFragment != null) { 
     //ft.detach(mFragment); //requires API Level 13 
     ft.remove(mFragment); //this does not do the same thing as detach 
    } 
} 

tôi thấy rằng detach là chỉ dành cho những API Cấp 13. Tôi cố gắng remove, nhưng nó không làm điều tương tự, rõ ràng. Có ai có bất kỳ ý tưởng nào về cách khắc phục điều này dựa trên mã trong số link đầu tiên không?


EDIT: Tôi đoán cùng đi cho attach như đó cũng là trong các mã, nhưng không được nhấn trước khi treo ứng dụng.

Trả lời

13

Có vẻ như thay thế một số vị trí trong mã tham chiếu đính kèm và tách bằng tính năng thêm và xóa sẽ cho phép mã hoạt động bình thường trong môi trường API cấp 13 trước.

public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); 
     if (mFragment != null) { // && !mFragment.isDetached()) { 
      FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); 
      //ft.detach(mFragment); 
      ft.remove(mFragment); 
      ft.commit(); 
     } 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     //if (mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
     //} else { 
     // ft.attach(mFragment); 
     //} 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      //ft.detach(mFragment); //requires API 13 
      ft.remove(mFragment); //this does not do the same thing as detach 
     } 
    } 
+4

nhưng với ft.add/gỡ bỏ trạng thái đoạn bị mất khi chuyển đổi giữa các tab – Arvis

2

nếu bạn đang sử dụng FragmentTransaction trong API 4+ compatablity gói -android.support.v4.app.FragmentTransaction - bạn sẽ có thể gọi đính kèm và tách các phương pháp trên mức API trước 13 nền tảng.

http://developer.android.com/resources/samples/Support4Demos/index.html

+0

bài đăng blog liên quan: [ Các mảnh vỡ cho tất cả] (http://android-developers.blogspot.com/2011/03/fragments-for-all.html) – blahdiblah