2014-04-29 15 views
22

Khi tôi gọi findFragmentById() với id của đoạn của tôi, nó trả về null. Hãy để tôi chỉ cho bạn mã.findFragmentById return null

Các activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

     <fragment android:name="com.madduck.test.app.fragment.MainFragment" 
        android:id="@+id/main_fragment" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" /> 

     <fragment android:name="com.madduck.test.app.fragment.LoginFragment" 
        android:id="@+id/login_fragment" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" /> 
</LinearLayout> 

Các MainActivity.java

private static final int LOGIN = 0; 
private static final int MAIN = 1; 
private static final int FRAGMENT_COUNT = MAIN +1; 
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT] 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    FragmentManager fm = getSupportFragmentManager(); 
    fragments[LOGIN] = fm.findFragmentById(R.id.login_fragment); 
    fragments[MAIN] = fm.findFragmentById(R.id.main_fragment); 

    FragmentTransaction transaction = fm.beginTransaction(); 
    for (Fragment f : fragments) { 
     if (f != null) 
      transaction.hide(f); 
     else 
      Log.e(TAG, "???"); 
    } 

    transaction.commit(); 
} 

Cái này là khi tôi gọi fm.findFragmentById(R.id.login_fragment); tôi nhận được null nhưng khi tôi gọi fm.findFragmentById(R.id.main_fragment); tôi nhận được mảnh .

+0

bài viết nhật ký sự cố đầy đủ và đoạn mã của bạn – Libin

+1

Cảm ơn cho câu trả lời nhanh chóng của bạn, tôi thấy giải pháp (đã sử dụng support.v4 trong một mảnh và loại bình thường trong một đoạn khác) Tôi không thể đăng giải pháp ngay bây giờ, bởi vì tôi không có 10 danh tiếng, nhưng sẽ tự trả lời vào ngày mai. Tôi tìm kiếm một chút trước và tôi không tìm thấy gì liên quan đến điều đó. – Kar0t

+0

Tôi nghi ngờ đó có thể là vấn đề. Bất kỳ cách nào bạn tìm thấy nó. Tốt – Libin

Trả lời

27

chỉ phát hiện ra lỗi của tôi.

Trong MainActivity.java i đã nhập android.support.v4.app.Fragment; và trong tệp LoginFragment.java i của tôi đã nhập android.app.Fragment;. Tôi đã thay đổi nó thành cùng một thứ và fm.findFragmentById(R.id.login_fragment) bây giờ trả về mảnh bên phải.

+0

Tôi lãng phí cả ngày cố gắng tìm một câu trả lời cho một vấn đề tương tự, nhờ – ppp

+0

@AnPel chỉ làm như vậy, đã dành 4 giờ trên đó, lol. – Benten

+2

Cảm ơn thông tin chi tiết. Trong trường hợp của tôi bằng cách sử dụng getSupportFragmentManager() thay vì getFragmentManager() đã giải quyết được vấn đề như là phân đoạn cơ bản của tôi là từ gói hỗ trợ. –

60

Câu trả lời Kar0t hoàn toàn ổn nhưng điều này có thể giúp ai đó. Trong trường hợp của tôi, tôi đã có một mảnh vỡ bên trong một mảnh và tôi đã nhận được FragmentManager sai. Tôi chỉ phải gọi:

getChildFragmentManager()

và sau đó chỉ cần tìm ra Fragment như thường lệ:

fm.findFragmentById(R.id.fragment) 
+3

Tôi cũng đang vật lộn ở đây. Cảm ơn bạn rất nhiều! –

+1

rất cảm ơn sự giúp đỡ của bạn! –