2012-05-21 36 views
31

Tôi đã tạo một lớp View mới. Trong lớp học đó, tôi cần truy cập vào số FragmentManager, nhưng tôi không thể tìm ra cách.FragmentManager từ Ngữ cảnh

Tôi có thể truy cập vào FragmentManager từ ngữ cảnh không?

CustomView extends LinearLayout 

Trả lời

47

Chỉ khi ngữ cảnh cụ thể mở rộng Hoạt động (Hậu tổ ong) hoặc FragmentActivity (trước tổ ong).

Trong trường hợp đó, bạn phải đảm bảo chắc chắn 100% đó là hoạt động sử dụng phản chiếu hoặc thử nắm bắt.

try{ 
    final Activity activity = (Activity) context; 

    // Return the fragment manager 
    return activity.getFragmentManager(); 

    // If using the Support lib. 
    // return activity.getSupportFragmentManager(); 

} catch (ClassCastException e) { 
    Log.d(TAG, "Can't get the fragment manager with this"); 
} 

tưởng tôi khuyên bạn nên sắp xếp để một View được thực sự chỉ dành cho hiển thị nội dung và không nên thực sự thay đổi trạng thái của ứng dụng của bạn, nhưng đó là quan điểm của tôi.

+0

DialogFragment chứa chế độ xem được đề cập. Về cơ bản tôi có một DialogFragment được chia thành các phần dựa trên nút hiện đang được chọn, tôi hiển thị khung nhìn thích hợp. Tôi chia từng phần có thể hiển thị thành chế độ xem riêng. Tôi đã sử dụng một mảnh vỡ, nhưng tôi không thể nhúng một đoạn trong một đoạn. – Steve

+0

Tôi chỉ tìm thấy chế độ xem theo id và chuyển tham chiếu đến Hoạt động. – Steve

+0

Tại sao không chỉ có giao diện điều khiển chế độ xem DialogFragment hoán đổi? Có vẻ như nó sẽ phức tạp như những gì bạn đang cố gắng làm. – DeeV

29

nếu bạn đang sử dụng mảnh vỡ hỗ trợ, bạn có thể thực sự muốn:

try { 
    FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager(); 
} catch (ClassCastException e) { 
    Log.e(TAG, "Can't get fragment manager"); 
} 
4

Đây là những gì làm việc cho tôi:

Context mContext; 
... 


//Get FragmentManager 
FragmentManager fragmentManager = ((Activity) mContext).getFragmentManager(); 

(Tất nhiên bạn phải trước hết là khởi mContext)

+0

logic này là gì khi đúc, làm thế nào nó có thể – blackHawk

3

Bạn có thể truy cập vào một FragmentManager (hoặc SupportFragmentManager) trong một Ứng dụng - nhưng như các câu trả lời khác gợi ý, bạn chỉ có thể thực hiện điều này thông qua một cá thể Hoạt động.

Tuy nhiên, bạn có thể truy cập vào một FragmentManager qua Hoạt động mà không cần phải trực tiếp gọi cho bất kỳ hoạt động bằng cách sử dụng giao diện ActivityLifecycleCallbacks:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks { 

    @Override 
    public void onActivityCreated(Activity activity, Bundle bundle) { 
     activity.getFragmentManager() 
     if(activity instanceof FragmentActivity) { 
      ((FragmentActivity)activity).getSupportFragmentManager(); 
     } 
     unregisterActivityLifecycleCallbacks(this); 
    } 

    ... 
0

Kể từ khi đối tượng hoàn cảnh của bạn không thể lúc nào cũng được đúc trực tiếp đến hoạt động, này là cách đáng tin cậy hơn để thực hiện việc này:

@Nullable 
public static Activity getActivityFromContext(@NonNull Context context){ 
    while (context instanceof ContextWrapper) { 
     if (context instanceof Activity) return (Activity) context; 
     context = ((ContextWrapper)context).getBaseContext(); 
    } 
    return null; //we failed miserably 
} 
Các vấn đề liên quan