使用 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 将数据发送到片段