如何将数据从一个片段传输到另一个片段android

我知道的一个方法是通过activity.We可以发送数据从片段到活动和活动到片段是否有任何其他方式。

Related of "如何将数据从一个片段传输到另一个片段android"

将数据从一个片段传递到另一个片断将会有所帮助。

 LifeShapeDetailsFragment fragment = new LifeShapeDetailsFragment(); // object of next fragment Bundle bundle = new Bundle(); bundle.putInt("position", id); fragment.setArguments(bundle); 

然后push/call next Fragments.

并编码到下一个片段:

 Bundle bundle = this.getArguments(); int myInt = bundle.getInt("position", 0); 

从文档引用

通常你会想要一个片段与另一个片段进行通信,例如根据用户事件来改变内容。 所有片段到片段的通信都是通过关联的活动完成的。 两个碎片不应该直接沟通。

我build议你按照文档中的方法,我还没有尝试过任何其他的select

有关更多信息和示例chekc在下面的链接中的文档

http://developer.android.com/training/basics/fragments/communicating.html

有两种方法我认为是可行的:

A。通过你所拥有的活动来沟通,并通过自己的活动转发消息给其他片段,详情可以在这里find官方的Android文档:

http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

引用:

在某些情况下,您可能需要一个片段来与活动共享事件。 一个好方法是在片段内定义一个callback接口,并要求主机活动实现它。 当活动通过接口接收callback时,可以根据需要与布局中的其他片段共享信息。

通信接口可能看起来像这样:

 public interface IActionListener{ //You can also add parameters to pass along etc public void doSomething(); } 

片段看起来像这样:

 public class MyFragment extends Fragment{ private WeakReference<IActionListener> actionCallback; @Override public void onAttach(Activity activity) { super.onAttach(activity); try { // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception actionCallback = new WeakReference<IActionListener>((IActionListener) activity); } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement IActionListener."); } } } 

我在这里使用WeakReference,但这真的取决于你。 现在可以使用actionCallback与拥有的活动进行通信,并调用IActionListener中定义的方法。

拥有活动将如下所示:

 public class MyActivity extends ActionBarActivity implements IActionListener { public void doSomething(){ //Here you can forward information to other fragments } } 

B。 至于第二种方法 – 您可以使用接口直接与对方进行通信 – 这样您就不必知道您正在与之交谈的片段的确切类别,从而确保了松耦合。

设置如下:您有两个片段(或更多)和一个活动(启动第二个片段)。 我们有一个接口,让Fragment 2一旦完成任务就发送一个响应给Fragment 1。 为了简单起见,我们只是重新使用我在A中定义的接口

这是我们的片段1:

 public class FragmentOne extends Fragment implements IActionListener { public void doSomething() {//The response from Fragment 2 will be processed here} } 

使用A.Fragment 1中描述的方法要求它拥有Activity来启动Fragment 2.但是,Activity将沿着Fragment 1作为parameter passing给Fragment 2,因此Fragment 2可以在以后间接访问Fragment 1并发送回复。 我们来看看Activity如何预处理Fragment 2:

  public class MyActivity extends ActionBarActivity { // The number is pretty random, we just need a request code to identify our request later public final int REQUEST_CODE = 10; //We use this to identify a fragment by tag public final String FRAGMENT_TAG = "MyFragmentTag"; @Override public void onStartFragmentTwo() { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); // The requesting fragment (you must have originally added Fragment 1 using //this Tag !) Fragment requester = manager.findFragmentByTag(FRAGMENT_TAG); // Prepare the target fragment Fragment target = new FragmentTwo(); //Here we set the Fragment 1 as the target fragment of Fragment 2's //communication endeavors target.getSelf().setTargetFragment(requester, REQUEST_CODE); // Hide the requesting fragment, so we can go fullscreen on the target transaction.hide(requester); transaction.add(R.id.fragment_container, target.getSelf(), FRAGMENT_TAG); transaction.addToBackStack(null); transaction.commit(); } } 

提示 :我使用的是支持框架,所以如果你开发的只是Android 3.0,你可以简单地使用FragmentActivity而不是ActionBarActivity。

现在FragmentTwo正在启动,让我们看看FragmentTwo如何与FragmentOne进行通信:

 public class FragmentTwo extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(savedInstanceState != null){ // Restore our target fragment that we previously saved in onSaveInstanceState setTargetFragment(getActivity().getSupportFragmentManager().getFragment(savedInstanceState, TAG), MyActivity.REQUEST_CODE); } return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Retain our callback fragment, the TAG is just a key by which we later access the fragment getActivity().getSupportFragmentManager().putFragment(outState, TAG, getTargetFragment()); } public void onSave(){ //This gets called, when the fragment has done all its work and is ready to send the reply to Fragment 1 IActionListener callback = (IActionListener) getTargetFragment(); callback.doSomething(); } } 

现在将调用片段1中doSomething()的实现。

这是解决scheme,

按以下步骤操作:

1创build这样的界面

  public interface TitleChangeListener { public void onUpdateTitle(String title); } 

2.使用这个接口来实现你的活动

  for.eg public class OrderDetail extends ActionBarActivity implements TitleChangeListener 

3.在这个活动上创buildonUpdateTitle()

  public void onUpdateTitle(String title) { //here orderCompletedDetail is the object second fragment name ,In which fragement I want send data. orderCompletedDetail.setTitle(title); } 

现在,在片段中写一些代码。

  public class OrderPendingDetail extends Fragment { private View rootView; private Context context; private OrderDetail orderDetail; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.order_pending_detail, container, false); context = rootView.getContext(); //here OrderDetail is the name of ActionBarActivity orderDetail = (OrderDetail) context; //here pass some text to second Fragment using button ClickListener but_updateOrder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // here call to Activity onUpdateTitle() orderDetail.onUpdateTitle("bridal"); } }); return rootView; } } 

5.在第二个Fragment中写一些代码setTitle()

  public void setTitle(String title) { TextView orderCompeted_name=(TextView)rootView.findViewById(R.id.textView_orderCompeted_name); orderCompeted_name.setText(title); //here you see the "bridal" value for TextView } 

在这个解决scheme中,当你点击一个片段的button时,它会显示第二个片段的值。 我希望这会对你有所帮助。

在使用片段时,允许片段通过使用活动作为中间媒介进行交stream是最常见的做法。 访问http://developer.android.com/guide/components/fragments.html了解更多关于这个重要模式的细节&#x3002; 无论何时您需要与另一个片段进行交互,您应该始终在片段的活动中使用一个方法,而不是直接访问其他片段。 从另一个片段访问一个片段唯一有意义的是当你知道你不需要在另一个活动中重用你的片段。 假设你将会重用它们,而不是将它们硬编码到彼此,你几乎总是应该写一些片段。