如何在 Fragments 中使用 setArguments() 和 getArguments() 方法?
Posted
技术标签:
【中文标题】如何在 Fragments 中使用 setArguments() 和 getArguments() 方法?【英文标题】:How to use setArguments() and getArguments() methods in Fragments? 【发布时间】:2011-07-22 11:40:05 【问题描述】:我有 2 个片段:(1)Frag1 (2)Frag2。
片段1
bundl = new Bundle();
bundl.putStringArrayList("elist", eList);
Frag2 dv = new Frag2();
dv.setArguments(bundl);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.the_fragg,dv);
ft.show(getFragmentManager().findFragmentById(R.id.the_fragg));
ft.addToBackStack(null);
ft.commit();
如何在 Frag2 中获取这些数据?
【问题讨论】:
【参考方案1】:只需在您的Frag2
的onCreateView()
方法中调用getArguments()
:
public class Frag2 extends Fragment
public View onCreateView(LayoutInflater inflater,
ViewGroup containerObject,
Bundle savedInstanceState)
//here is your arguments
Bundle bundle=getArguments();
//here is your list array
String[] myStrings=bundle.getStringArray("elist");
【讨论】:
在我的情况下它返回 null,知道为什么会这样吗? 您将 ArrayList 放入包中,但得到一个字符串数组。你应该这样做bundle.getStringArrayList("elist");
你忘记了return语句:return super.onCreateView(inflater, container, savedInstanceState);
Oncreateview 一直在调用。所以只需在 oncreate() 方法中调用 getarguments。只有在fragment被销毁或者新创建的时候才会调用。
@almaz_from_kazan @HabeebPerwad 为什么你在onCreateView
中使用getArguments()
,而不是在onCreate
中?【参考方案2】:
例如:添加数据:-
Bundle bundle = new Bundle();
bundle.putString("latitude", latitude);
bundle.putString("longitude", longitude);
bundle.putString("board_id", board_id);
MapFragment mapFragment = new MapFragment();
mapFragment.setArguments(bundle);
例如:获取数据:-
String latitude = getArguments().getString("latitude")
【讨论】:
【参考方案3】:您有一个名为 getArguments()
的方法,它属于 Fragment
类。
【讨论】:
【参考方案4】:在 Frag1 中:
Bundle b = new Bundle();
b.putStringArray("arrayname that use to retrive in frag2",StringArrayObject);
Frag2.setArguments(b);
在 Frag2 中:
Bundle b = getArguments();
String[] stringArray = b.getStringArray("arrayname that passed in frag1");
就这么简单。
【讨论】:
【参考方案5】:以正确的方式实例化 Fragment!
getArguments()
setArguments()
方法似乎非常有用 使用静态方法实例化 Fragment。 即Myfragment.createInstance(String msg)
怎么做?
片段代码
public MyFragment extends Fragment
private String displayMsg;
private TextView text;
public static MyFragment createInstance(String displayMsg)
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
args.setString("KEY",displayMsg);
fragment.setArguments(args); //set
return fragment;
@Override
public void onCreate(Bundle bundle)
displayMsg = getArguments().getString("KEY"): // get
@Override
public View onCreateView(LayoutInlater inflater, ViewGroup parent, Bundle bundle)
View view = inflater.inflate(R.id.placeholder,parent,false);
text = (TextView)view.findViewById(R.id.myTextView);
text.setText(displayMsg) // show msg
returm view;
假设您想在创建实例时传递一个字符串。这 你会怎么做。
MyFragment.createInstance("This String will be shown in textView");
了解更多
1) Why Myfragment.getInstance(String msg) is preferred over new MyFragment(String msg)?2) Sample code on Fragments
【讨论】:
android.os.Bundle 没有 setString。你的意思是 putString() 吗?【参考方案6】:对于像我这样希望发送原始对象以外的对象的人, 因为你不能在你的片段中创建一个参数化的构造函数,只需在你的片段中添加一个 setter 访问器,这对我总是有用的。
【讨论】:
那是错误的方式。如果片段重新创建,它将丢失这些参数。发送到片段的参数应该是可序列化的,通过setArguments()
传递。可以使用 setter 设置不可序列化的参数,但应该在重新创建活动/片段时再次调用它。【参考方案7】:
如果您正在使用导航组件和导航图,请创建这样的包
val bundle = bundleOf(KEY to VALUE) // or whatever you would like to create the bundle
然后在导航到另一个片段时使用:
findNavController().navigate(
R.id.action_navigate_from_frag1_to_frag2,
bundle
)
当您登陆目标片段时,您可以使用
访问该捆绑包Bundle b = getArguments()// in Java
或
val b = arguments// in kotlin
【讨论】:
以上是关于如何在 Fragments 中使用 setArguments() 和 getArguments() 方法?的主要内容,如果未能解决你的问题,请参考以下文章