如何在Fragments中使用setArguments()和getArguments()方法?

nhhxz33t  于 2022-11-14  发布在  Android
关注(0)|答案(7)|浏览(195)

我有两个片段:(1)片段1(2)片段2。

片段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中获取此数据?

b1uwtaje

b1uwtaje1#

只需在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");   
     }
}

编辑:

最好的做法是在onCreate方法中读取和保存参数。在onCreateView中这样做更糟糕,因为每次fragment创建视图时都会调用onCreateView(例如每次fragment从backstack弹出时)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle arguments = getArguments(); 
}
idfiyjo8

idfiyjo82#

例如:添加数据:-

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

qybjjes13#

您有一个名为getArguments()的方法,它属于Fragment类。

nqwrtyyt

nqwrtyyt4#

在片段1中:

Bundle b = new Bundle();

b.putStringArray("arrayname that use to retrive in frag2",StringArrayObject);

Frag2.setArguments(b);

在片段2中:

Bundle b = getArguments();

String[] stringArray = b.getStringArray("arrayname that passed in frag1");

就是这么简单。

lzfw57am

lzfw57am5#

以正确的方式示例化片段!

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

gjmwrych

gjmwrych6#

对于那些像我一样希望发送原语之外的对象的人来说,由于不能在片段中创建参数化构造函数,只需在片段中添加一个setter访问器,这对我来说总是有效的。

okxuctiv

okxuctiv7#

如果您使用导航组件和导航图,请创建一个如下所示的包

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

相关问题