如何在Fragment之间传递Bundle

41

我在我的应用程序中使用片段。这是我的第一个片段,它只是填充一个 XML 文件:

public class FragmentA extends SherlockFragment
{
    Context myContext,appContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    myContext = getActivity();
    appContext=getActivity().getApplicationContext();
    arguments = getArguments();
    doctor_id=arguments.getInt("doctor_id");
    userType=arguments.getString("userType");
    return inflater.inflate(R.layout.left_panel, container,false);
}

这是包含一个片段的left_panel .xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <fragment
        android:id="@+id/titles"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        class="com.example.sample.ListFrag" />

</LinearLayout>

这是我的ListFrag类:

public class ListFrag extends Fragment 
{
    Context myContext,appContext;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        layoutView = inflater.inflate(R.layout.activity_doctor_list,container);
        myContext = getActivity();
        appContext=getActivity().getApplicationContext();
        arguments=getArguments();
        int doctor_id=arguments.getInt("doctor_id");
}
}

我不知道如何将Bundle arguments从FragmentA传递到ListFrag。

4个回答

81

在您的FragmentA片段中,将Bundle设置为参数。

Bundle args = new Bundle();
args.putInt("doctor_id",value);    
ListFrag newFragment = new ListFrag ();
newFragment.setArguments(args);

在你的ListFrag片段中,获取Bundle的方法如下:

Bundle b = getArguments();
int s = b.getInt("doctor_id");

但我只是在加载left_panel.xml文件中给出Fragment名称的XML文件中...这是我调用另一个Fragment的方法...你的答案合适吗? - Vikky
请查看 onInflate()。创建自己的属性,将其复制到 arguments.bundle 中。链接 - Tarun
有一个选项可以通过onInflate函数将参数设置为xml充气片段。我在上面的评论中提供了该函数示例的链接。 - Tarun
@Tarun onInflate从XML布局获取参数,而不是从充气布局的Activity或Fragment获取参数,这就是我认为Vikky所问的。 - Pierre-Luc Paour
8
这段代码有误。需要将 String s = b.getInt("doctor_id"); 改为 int s = b.getInt("doctor_id");。这是一个小错误。虽然出错了但是加1。 - Chad Bingham
如果可以从fragmentA加载fragmentB,则此答案是有意义的。 如果要求始终从Activity加载片段,或者动态加载片段,即有时从A或C等加载fragmentB,则使用接口方法更有意义。 接口方法在activity中实现,并且所有片段都实现此接口。 - Rusheel Jain

17

片段与片段之间设置和获取参数:

启动活动:

     int friendId = 2; //value to pass as extra 
     i = new Intent(firstActivity, SecondActivity.class);
     i.putExtra("friendsID", friendId);
     firstActivity.startActivity(i);

第二个活动:

     Fragment_A mFragment_A = new Fragment_A();
     mFragment_A.setArguments(getIntent().getExtras());

片段_A:

    Bundle bundle = new Bundle();
    String Item = getArguments().getString("friendsID");
    bundle.putInt("friendsID", Integer.parseInt(Item));

    // code

    Fragment_B mFragment_B = new Fragment_B();
    mFragment_B.setArguments(bundle);

碎片_B:

    Bundle bundle = getArguments();
    int value = bundle.getInt("friendsID");

    Log.e("value Fragment get Argument ", "friendsID :" + value);

这对我有用,你可以尝试这个,也许这个示例可以帮助你。


你可以如何完整地实现它? - user3402040
@delive 我没听懂你的问题?你能让你的问题更清楚吗? - sherin
@delive 片段A-----"传递"----函数名(Data)--> FragmentActivity -----"获取"----函数名(string data) ------> 这是一个循环。 - sherin
公共的无返回值方法getFragment(Fragment frag){},我现在有:Class fragmentClass = fragmentCurrent; Fr f = (Fr) fragmentClass.newInstance(),但总是得到一个新实例... - user3402040

1
在ListFrag中创建一个名为ListFrag的静态方法,例如:
public static ListFrag newInstance(int doctorId) {
  ListFrag frag = new ListFrag();
  Bundle args = new Bundle();
  args.putExtra("doctor_id", doctorId);
  frag.setArguments(args);
  return frag;
}

当您从 Fragment A 创建 ListFrag 时,您需要调用:
Fragment frag = ListFrag.newInstance(this.doctor_id);
// use frag with getSupportChildFragmentManager();

我并不是从FragmentA创建ListFrag.. 我是在xml文件中使用Fragment,然后从Fragment A中填充该xml文件。 - Vikky
如果您正在寻找编程方面的解决方案,那么黑带就是您需要的。 - gunar

1
你有两个选择:

A. 如果您有ListFragment的引用,您可以通过以下方式为FragmentA设置目标片段:

  1. FragmentA中,使用this.setTargetFragment(yourListFragment);
  2. 然后使用this.getTargetFragment().setArguments(yourBundle);
  3. ListFragment中,使用this.getArguments();获取它

B. 最合理的方法

我打赌您的片段都在同一个活动中,因此她们都有对彼此的引用。 您可以从FragmentA将数据传递给活动,并将其传递给ListFragment

FragmentA --数据--> FragmentActivity --数据--> ListFragment


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接