如何使用Android FragmentManager传递变量

4

我有以下简单的代码来在内容框架中切换一个片段到另一个片段。是否有一种简单的方式来传递变量?

FragmentManager fm = getActivity().getFragmentManager();

fm.beginTransaction().replace(R.id.content_frame, new TransactionDetailsFragment()).commit();

2
不知道为什么这个被标记为重复,这个问题明确提到了fragmentmanager,而引用的答案只涉及一个新的fragment类。对于Java新手来说,这是有区别的。但是被接受的答案似乎已经正确地承认了这一点。 - Mike Purcell
1
很棒的问题,这正是我在寻找的,与被标记为“重复”的问题非常不同。 - E.Akio
3个回答

9
您可以使用Bundle:
FragmentManager fm = getActivity().getFragmentManager();
Bundle arguments = new Bundle();
arguments.putInt("VALUE1", 0);
arguments.putInt("VALUE2", 100);

MyFragment myFragment = new Fragment();
fragment.setArguments(arguments);

fm.beginTransaction().replace(R.id.content_frame, myFragment).commit();

那么,您可以按照以下方式检索:

public class MyFragment extends Fragment {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = this.getArguments();
        if (bundle != null) {
            int value1 = bundle.getInt("VALUE1", -1);
            int value2 = bundle.getInt("VALUE2", -1);
        }
    }
}

2

您可以使用newInstance方法 - 在Fragment类中创建一个方法,例如:

 public static TransactionDetailsFragment newInstance(String param) {
    TransactionDetailsFragment frag = new TransactionDetailsFragment();
    Bundle bund = new Bundle();
    bund.putString("paramkey", param); // you use key to later grab the value
    frag.setArguments(bund);
    return frag;
}

因此,要创建您的片段,请执行以下操作:

TransactionDetailsFragment.newInstance("PASSING VALUE");

这个用法替代了你的new TransactionDetailsFragment()

然后,例如在同一片段的onCreate/onCreateView中,你可以像这样获取该值:

String value = getArguments().getString("paramkey");

0
创建一个带参数的构造函数给TransactionDetailsFragment怎么样?
fm.beginTransaction().replace(R.id.content_frame, new TransactionDetailsFragment(YOUR_PARAMS)).commit();

当您将new TransactionDetailsFragment(YOUR_PARAMS)作为FragmentTransaction的参数创建时,我认为使用构造函数是一个不错的选择。


使用这个,但是有一个问题--没有无参构造函数,这个片段不能在XML布局中使用。 - Pavlus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接