【问题标题】:How to use setArguments() and getArguments() methods in Fragments?如何在 Fragments 中使用 setArguments() 和 getArguments() 方法?
【发布时间】: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 中获取这些数据?

【问题讨论】:

    标签: android android-fragments


    【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-05-06
            • 2011-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多