Cách sử dụng (hoặc "Chúng ta có thể sử dụng") getChildFragmentManager()
theo cách lập trình (động) được thêm Fragment
s?getChildFragmentManager() trên các phân đoạn được thêm theo chương trình (động)?
Đây là ví dụ của tôi.
Tôi có một MainActivity
, một OuterFrag
và một InnerFrag
. Tôi sẽ thêm OuterFrag
vào MainActivity
động bởi FragmentManager
. Ngoài ra, tôi cũng sẽ thêm InnerFrag
vào OuterFrag
cũng theo kiểu động FragmentManager
. Nhưng tôi muốn thêm InnerFrag
chính xác là con của OuterFrag
, không thay thế OuterFrag
và là con mới của MainActivity
.
Tôi muốn giữ phân cấp này: MainActivity -> OuterFrag -> InnerFrag
. Vì vậy, MainActivity luôn có thể gọi OuterFrag.
Nhưng KHÔNG thay đổi từ thứ bậc này: MainActivity -> OuterFrag
thành phân cấp này: MainActivity -> InnerFrag
mà MainActivity
sẽ mất OuterFrag
.
Đây là mã ví dụ của tôi.
MainActivity.java
package com.example.frag;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new OuterFrag()).commit();
getSupportFragmentManager().executePendingTransactions();
System.out.println("Before: "
+ getSupportFragmentManager().findFragmentById(R.id.frameLayout));
((OuterFrag) getSupportFragmentManager().findFragmentById(R.id.frameLayout))
.addInnerFrag();
System.out.println("After: "
+ getSupportFragmentManager().findFragmentById(R.id.frameLayout));
}
}
activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frameLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</FrameLayout>
OuterFrag.java
package com.example.frag;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class OuterFrag extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.outer_frag, container, false);
}
public void addInnerFrag() {
getFragmentManager().beginTransaction().replace(this.getId(), new InnerFrag()).commit();
getFragmentManager().executePendingTransactions();
// getChildFragmentManager().beginTransaction().add(this.getId(), new InnerFrag()).commit();
// getChildFragmentManager().executePendingTransactions();
}
}
outer_frag.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="i am the OUTER frag" />
InnerFrag.java
package com.example.frag;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class InnerFrag extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.inner_frag, container, false);
}
}
inner_frag.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="i am the INNER frag" />
Hiện nay, các mã trên có thể chạy mà không có lỗi. Nhưng nó thực sự thay đổi InnerFrag
là đứa con mới của MainActivity
. Điều này có thể được xác nhận bởi hai câu lệnh System Print Out mà đối tượng Before: Object và After: Object được thay đổi. Trong OuterFrag.java
, nếu getChildFragmentManager()
báo cáo được chạy thay vì getFragmentManager()
báo cáo, chúng tôi sẽ nhận được lỗi runtime sau:
12-07 02:29:38.406: E/AndroidRuntime(12051): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.frag/com.example.frag.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f070000 (com.example.frag:id/frameLayout) for fragment InnerFrag{46e32748 #0 id=0x7f070000}
Sử dụng getChildFragmentManager()
là lý thuyết đúng. Nó có thể được sử dụng trong một đoạn không được lập trình bổ sung (có nghĩa là thay đổi <FrameLayout>
thành , thêm thuộc tính android:name="com.example.frag.OuterFrag"
và xóa câu lệnh getSupportFragmentManager()
đầu tiên trong MainActivity.java
).Và nó đang giữ đúng hệ thống phân cấp: MainActivity -> OuterFrag -> InnerFrag
. Nhưng những lời của mảnh gốc (outer_frag.xml
) không bao giờ có thể bị lấy đi.
Tóm lại, tôi muốn tham khảo OuterFrag
trong MainActivity
luôn. Và tôi muốn OuterFrag
hoạt động như một trình giữ chỗ để tải khác nhau InnerFrag
s. Tóm lại, tôi muốn gọi getChildFragmentManager()
trong OuterFrag
, khi được thêm theo chương trình (động).
Bạn có làm việc này? Câu hỏi của tôi là khi nào bạn thêm 'InnerFrag' để nó phù hợp với vòng đời của' OuterFrag'? – StuStirling