使用FragmentTransaction将数据发送到碎片

9
我在我的片段类中调用了这个方法: ```java this ```
@OnClick(R.id.blockedLinkLayout)
public void onBlockedClick(){
    final FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.content, new SettingsBlockedUsersFragment(), FRAGMENT_TAG);
    ft.commit();
}

它只是用选定的片段替换了我的当前片段。

我的问题是,我如何使用FragmentTransaction从我的父片段向子片段发送一些数据(例如String值)?

4个回答

31

只需将它们作为片段参数捆绑在一起传递

在父片段中:

SettingsBlockedUsersFragment fragment = new SettingsBlockedUsersFragment();
Bundle arguments = new Bundle();
arguments.putString( string_key , desired_string);
fragment.setArguments(arguments);
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, fragment , FRAGMENT_TAG);
ft.commit();

在子片段中:

Bundle arguments = getArguments();
String desired_string = arguments.getString(string_key);

1
它有效!如果我想发送例如HashMap或ArrayList怎么办? - y07k2
你可以使用 arguments.putStringArrayList(key, value);。请注意,Bundle 仅限于像 String 或 int 这样的简单值。 - Mohsen fallahi
那我需要将 Bundle 类型更改为什么? - y07k2
1
只需使用 arguments.putStringArrayList("my_array", the_string_array); ;),你无需执行其他任何操作。 - Mohsen fallahi

4

FragmentTransaction 就是用来转换碎片的,它并不会 "传递" 任何东西。你需要使用一个 Bundle

SettingsBlockedUsersFragment frag = new SettingsBlockedUsersFragment();
Bundle b = new Bundle();
// put stuff into bundle...
b.putString("user", "steve");

// Pass the bundle to the Fragment
frag.setArguments(b);

// Use Fragment Transaction
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, frag, FRAGMENT_TAG);
ft.commit();

然后在Fragment的onCreate方法内,您可以这样做

String user = getArguments().getString("user");

还有其他一些将数据传递到Fragment的方法,可以在最佳实践:实例化新Android Fragment中了解。


我认为你想说的是 FragmentTransaction 而不是 FragmentTransition - kandroidj

0

你可以在你的片段类中使用工厂方法(如文档中推荐的那样)

public static YourFragment newInstance(String sample) {
    YourFragment fragment = new YourFragment();
    Bundle args = new Bundle();
    args.putString(KEY, sample);
    fragment.setArguments(args);
    return fragment;
}

然后调用 YourFragment.newInstance("需要传递的字符串"); 来获取一个片段实例并在事务中使用它。

关键在于实际上使用 setArguments() 方法来传递数据。然后您可以像这样在片段的 onCreate 方法中检索此数据

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        streamSource = getArguments().getParcelable(KEY);
    }
}

0
在你的 SettingsBlockedUsersFragment 类中,添加一个如下所示的静态方法:
public class SettingsBlockedUsersFragment extends Fragment {
    private static final String MY_STRING = "my_string";


    public static SettingsBlockedUsersFragment newInstance(String yourStringValue){
        SettingsBlockedUsersFragment frag = new SettingsBlockedUsersFragment();
        Bundle args = new Bundle();
        args.putString(MY_STRING, yourStringValue);
        frag.setArguments(args);
        return frag;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
          Bundle args = getArguments();
          if(args != null){
               String myString = args.getString(MY_STRING);
          }
    }
}

在你的片段事务中,你可以像这样传递参数。
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content,SettingsBlockedUsersFragment.newInstance("my string"), FRAGMENT_TAG);
ft.commit();

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