使用 FragmentTransaction 将数据发送到片段

Posted

技术标签:

【中文标题】使用 FragmentTransaction 将数据发送到片段【英文标题】:Send data to fragment with FragmentTransaction 【发布时间】:2016-07-02 16:18:07 【问题描述】:

我在我的片段类中调用这个:

@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 值)从我的父片段发送到我的子片段?

【问题讨论】:

【参考方案1】:

只需将它们作为片段参数传递到一个包中

在父片段中:

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);

【讨论】:

有效!如果我想发送例如HashMap oraz ArrayList? 你可以使用 arguments.putStringArrayList(key, value); .请注意, bundle 仅限于简单的值,如 String 或 int 。 所以我需要将 Bundle 类型更改为什么? 只使用 arguments.putStringArrayList("my_array", the_string_array); ;) 你不需要做任何其他事情【参考方案2】:

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");

Best practice for instantiating a new android Fragment 讨论了将数据传递到 Fragment 的其他方法

【讨论】:

我想你的意思是说FragmentTransaction而不是FragmentTransition【参考方案3】:

您可以在片段类中使用工厂方法(按照文档中的建议)

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);
    

【讨论】:

【参考方案4】:

在您的 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();

【讨论】:

以上是关于使用 FragmentTransaction 将数据发送到片段的主要内容,如果未能解决你的问题,请参考以下文章

共享元素过渡适用于 FragmentTransaction.replace() 但不适用于 FragmentTransaction.add()

操作栏在 FragmentTransaction replace() 和 FragmentTransaction add() 上的行为方式

为啥要使用 FrameLayout 作为 FragmentTransaction 的片段容器? [复制]

使用 FragmentTransaction 将数据发送到片段

在 DialogFragment 中使用 FragmentManager 和 FragmentTransaction

fragmentTransaction.add 和 fragmentTransaction.replace 之间的区别