如何在 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】:

只需在您的Frag2onCreateView() 方法中调用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() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何向一个Fragment传递参数---setArguments方法的介绍

如何在 ViewPager 中使用 Fragments

片段已激活 - 尝试 setArguments 时

Fragment.setArguments()

将数据从Activity发送到Fragment - 如何?

使用 Fragments 进行 Android 搜索