[英]Android: How to send data from parent fragment to child fragment
所以我查看了其他問題,我一直無法提出解決方案。 所以基本上,我有一個父片段和一個子片段,我需要將一個整數傳遞給子片段。 子片段是在 XML 中定義的,因此據我所知,我無法附加包。 看起來它應該很簡單,但我一直無法弄清楚。
關於如何做到這一點的任何幫助都會很棒。 謝謝!
簡單的解決方案是在您的父片段 onCreateView 中獲取對您的子片段的引用
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.parent_fragment, container, false);
YourChildFragment fragment = (YourChildFragment) getChildFragmentManager().findFragmentById(R.id.child_fragment_id);
// pass your data
fragment.setMyInt(42);
return view;
}
您可以為此使用接口。 在父片段中創建接口並創建它的對象和 getter-setter 方法。
interface YourListner{
void methodToPassData(Object data);
}
static YourListner listnerObj;
public void setListnerObj(YourListner listnerObj) {
this.listnerObj = listnerObj;
}
在您的子片段中實現它。
然后,在父片段中添加以下代碼。
ChilefragmentName yourfrag=((ChilefragmentName) getSupportFragmentManager().findFragmentById(R.id.fragmentId))
if(yourfrag !=null)
{
//Set listner
yourfrag.setListnerObj((ChilefragmentName)yourfrag);
}
if(listnerObj!=null)
{
//Pass your data
listnerObj.methodToPassData(data);
}
您可以在子片段中的已實現方法中處理該數據。
如果您有一些參數要傳遞給通過 XML 定義的片段,我認為更好和更簡單的選擇是動態添加它。 在這種情況下,您可以像這樣將兩個參數 param1 和 param2 傳遞給子片段:
public static YourFragment newInstance(String param1, String param2) {
YourFragment fragment = new YourFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public YourFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
newInstance() 方法將參數存儲在包的參數包中。 當 Android 重新創建片段時,它會很有用。 在這種情況下,將在onCreate()
方法中檢索參數。
您可以使用參數將額外數據傳遞給片段。 此方法一般適用,不僅適用於 XML 參數。
...
ChildFragment cf = new ChildFragment();
Bundle b = new Bundle();
b.putInt("myInt", 0);
MyData data = new MyData();
b.putSerializable("myObject", data); // Pass entire objects
cf.setArguments(b);
...
transaction.commit();
您可以使用getArguments
接口獲取數據
...
MyData data = (MyData) getArguments.getSerializable('myObject');
...
雖然嚴格來說它沒有回答問題,但在某些情況下,當我們實際上想要將相同的參數傳遞給子片段時,這也有效:
class ChildFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle arguments = getArguments();
if (arguments == null) {
arguments = getParentFragment().getArguments();
}
if (arguments != null) {
if (arguments.containsKey(Constants.EXTRA_FOO)) {
// use it
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.