将片段之间的数据传递给活动

我需要从5个fragments之间传递数据到一个Activity ,当我到达第5个fragments ,那些fragments一个接一个地发送数据,然后我需要存储所有5个fragments数据,我们如何才能做到这一点。 任何想法是伟大的。 在这里输入图像描述

当活动获取所有数据然后处理它时,将每个片段的数据传递给活动。 您可以使用接口传递数据。

分段:

 public class Fragment2 extends Fragment { public interface onSomeEventListener { public void someEvent(String s); } onSomeEventListener someEventListener; @Override public void onAttach(Activity activity) { super.onAttach(activity); try { someEventListener = (onSomeEventListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement onSomeEventListener"); } } final String LOG_TAG = "myLogs"; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment2, null); Button button = (Button) v.findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { someEventListener.someEvent("Test text to Fragment1"); } }); return v; } } 

活动:

 public class MainActivity extends Activity implements onSomeEventListener{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Fragment frag2 = new Fragment2(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(R.id.fragment2, frag2); ft.commit(); } @Override public void someEvent(String s) { Fragment frag1 = getFragmentManager().findFragmentById(R.id.fragment1); ((TextView)frag1.getView().findViewById(R.id.textView)).setText("Text from Fragment 2:" + s); } } 

以下链接解释了片段间通信的devise。

与其他碎片进行通信

为了允许片段与其Activity交stream,可以在Fragment类中定义一个接口并在Activity中实现它。 Fragment在onAttach()生命周期方法中捕获接口实现,然后可以调用接口方法以便与Activity进行通信。

这是一个片段到活动通信的例子:

 public class HeadlinesFragment extends ListFragment { OnHeadlineSelectedListener mCallback; // Container Activity must implement this interface public interface OnHeadlineSelectedListener { public void onArticleSelected(int position); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mCallback = (OnHeadlineSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnHeadlineSelectedListener"); } } ... } 

现在片段可以通过使用OnHeadlineSelectedListener接口的mCallback实例调用onArticleSelected()方法(或接口中的其他方法)来将消息传递给活动。

例如,在用户点击一个列表项时调用片段中的以下方法。 该片段使用callback接口将事件传递给父活动。

 @Override public void onListItemClick(ListView l, View v, int position, long id) { // Send the event to the host activity mCallback.onArticleSelected(position); } 

实现接口

为了接收来自片段的事件callback,承载它的活动必须实现片段类中定义的接口。

例如,以下活动将实现上述示例中的界面。

 public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener{ ... public void onArticleSelected(int position) { // The user selected the headline of an article from the HeadlinesFragment // Do something here to display that article } } 

将消息传递给片段

主机活动可以通过使用findFragmentById()来捕获Fragment实例,然后直接调用片段的公共方法来将消息传递到片段。

例如,假设上面显示的活动可能包含另一个片段,用于显示上述callback方法中返回的数据指定的项目。 在这种情况下,活动可以将callback方法中收到的信息传递给另一个将显示该项目的片段:

 public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener{ ... public void onArticleSelected(int position) { // The user selected the headline of an article from the HeadlinesFragment // Do something here to display that article ArticleFragment articleFrag = (ArticleFragment) getSupportFragmentManager().findFragmentById(R.id.article_fragment); if (articleFrag != null) { // If article frag is available, we're in two-pane layout... // Call a method in the ArticleFragment to update its content articleFrag.updateArticleView(position); } else { // Otherwise, we're in the one-pane layout and must swap frags... // Create fragment and give it an argument for the selected article ArticleFragment newFragment = new ArticleFragment(); Bundle args = new Bundle(); args.putInt(ArticleFragment.ARG_POSITION, position); newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); } } } 

你必须返回信息到你的片段的活动。 而你的Activity将信息发送给它的片段:

 // In fragment A ((ParentActivity)getActivity()).dispatchInformations("test"); // In ParentActivity public void dispatchInformations(String mesg){ fragmentB.sendMessage(mesg); } 

这是一个基本的例子

有一个非常简单的方法可以将数据从Fragment传递到另一个不是容器的Activity。

1)在片段中:当你发起活动,说onButtonClick,传递你想传递的数据作为额外的意图,如:

  Intent intent = new Intent(getActivity(), MapsActivity.class); intent.putExtra("data", dataString); startActivity(intent); 

2)在接收活动中:在你的onCreate方法中,创build一个Bundle来检索传递的信息,例如:

 Bundle extras = getIntent().getExtras(); if (extras != null) { receivingString = extras.getString("data"); } else { // handle case } 

希望它帮助:)