[英]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.