Android:如何将数据从父片段发送到子片段

o2gm4chl  于 2023-03-27  发布在  Android
关注(0)|答案(6)|浏览(155)

所以我看了其他的问题,也没能想出解决的办法。所以基本上,我有一个父片段和一个子片段,我需要给子片段传递一个整数。子片段是在XML中定义的,所以我不能附加一个bundle。看起来应该很简单,但我没能弄明白。
任何关于如何做到这一点的帮助将是伟大的。谢谢!

nkoocmlb

nkoocmlb1#

简单的解决方案是在CreateView上的父片段中获取子片段的引用

@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;
}
ejk8hzay

ejk8hzay2#

你可以使用interface来实现这一点。在你的父片段中创建interface,并创建它的对象和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);

    }

你可以在你的子fragmen中的实现方法中处理这些数据。

qlzsbp2j

qlzsbp2j3#

如果你有一些参数要传递给通过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()方法将参数存储在bundle的arguments bundle中。当Android重新创建片段时,它将非常有用。在这种情况下,参数将在onCreate()方法中检索。

mec1mxoz

mec1mxoz4#

您可以使用参数将额外的数据传递给片段。此方法通常有效,不仅适用于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');
...
knsnq2tg

knsnq2tg5#

虽然严格来说它没有回答这个问题,但在某些情况下,当我们实际上想要将相同的参数传递给child-fragment时,它也可以工作:

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
            }
        }
    }
}
pkln4tw6

pkln4tw66#

可以使用具有父片段作用域的视图模型来传递数据:

class ParentFragment: Fragment() { 
    private val viewModel: MyViewModel by viewModels()
}

class ChildFragment: Fragment() {
    private val viewModel: MyViewModel by viewModels({requireParentFragment()})
}

另外,如果你想从子节点传递数据到父节点,你可以使用Fragment Result API。请确保在设置结果监听器时使用childFragmentManager。
父片段:

childFragmentManager.setFragmentResultListener("requestKey") { key, bundle ->
        val result = bundle.getString("bundleKey")
    }

子片段:

setFragmentResult("requestKey", bundleOf("bundleKey" to result))

相关问题