Android 在片段之间向活动传递数据
我需要将数据从5个Android 在片段之间向活动传递数据,android,Android,我需要将数据从5个片段传递到一个活动,当我到达第5个片段时,这些片段会一个接一个地发送数据,然后我需要存储所有5个片段数据我们如何才能做到这一点。任何想法都很好。您必须返回片段活动的信息。并将您的活动分派信息发送到其片段: // In fragment A ((ParentActivity)getActivity()).dispatchInformations("test"); // In ParentActivity public void dispatchInformations(Stri
片段
传递到一个活动
,当我到达第5个片段
时,这些片段
会一个接一个地发送数据,然后我需要存储所有5个片段
数据我们如何才能做到这一点。任何想法都很好。您必须返回片段活动的信息。并将您的活动分派信息发送到其片段:
// In fragment A
((ParentActivity)getActivity()).dispatchInformations("test");
// In ParentActivity
public void dispatchInformations(String mesg){
fragmentB.sendMessage(mesg);
}
这是一个基本示例当活动获取所有数据并对其进行处理时,将数据从每个片段传递给活动。 您可以使用接口传递数据 片段:
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);
}
}
下面的链接解释了片段之间通信的设计 为了允许片段与其活动通信,您可以在片段类中定义一个接口,并在活动中实现它。片段在其onAttach()生命周期方法期间捕获接口实现,然后可以调用接口方法以便与活动通信 以下是片段到活动通信的示例:
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()方法(或接口中的其他方法)向活动传递消息
例如,当用户单击列表项时,将调用片段中的以下方法。片段使用回调接口将事件传递给父活动
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Send the event to the host activity
mCallback.onArticleSelected(position);
}
实现接口
为了从片段接收事件回调,承载它的活动必须实现在片段类中定义的接口
例如,以下活动实现上述示例中的接口
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
}
}
向片段传递消息
private Subscription subscription;
public onCreate(Bundle savedInstanceState){
subscription = RxBus.getSubject()
.subscribe(new Subscriber<Object>() {
@Override
public void onNext(Object o) {
if (o instanceof MyData) {
Log.d("tag", (MyData)o.getData();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
宿主活动可以通过使用findFragmentById()捕获片段实例,然后直接调用片段的公共方法,将消息传递给片段
例如,假设上面显示的活动可能包含另一个片段,用于显示上面回调方法中返回的数据指定的项。在这种情况下,活动可以将回调方法中接收到的信息传递给将显示该项的另一个片段:
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();
}
}
}
有一种非常简单的方法可以将数据从一个片段传递到另一个不是其容器的活动 1) 在片段中:当您启动活动时,比如说onButtonClick,将您想要传递的数据作为您意图中的额外数据传递,如下所示:
Intent intent = new Intent(getActivity(), MapsActivity.class);
intent.putExtra("data", dataString);
startActivity(intent);
Bundle extras = getIntent().getExtras();
if (extras != null) {
receivingString = extras.getString("data");
} else {
// handle case
}
2) 在接收活动中:在onCreate方法中,创建一个Bundle来检索传递的信息,如下所示:
Intent intent = new Intent(getActivity(), MapsActivity.class);
intent.putExtra("data", dataString);
startActivity(intent);
Bundle extras = getIntent().getExtras();
if (extras != null) {
receivingString = extras.getString("data");
} else {
// handle case
}
希望有帮助:)我尝试了以上所有方法,但都不管用。这就是我如何使它工作的。我使用接口作为将数据从片段发送到活动的手段
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Send the event to the host activity
mCallback.onArticleSelected(position);
}
FragmentToActivity.java
碎片
活动一
您可以使用上述答案中解释的通信器模式。 此外,您还可以使用.来实现更好的解耦和效率 1-创建总线:
public final class RxBus {
private static final BehaviorSubject<Object> behaviorSubject
= BehaviorSubject.create();
public static BehaviorSubject<Object> getSubject() {
return behaviorSubject;
}
}
//the data to be passed
MyData data =getMyData();
RxBus.getSubject().onNext(data) ;
@Override
protected void onDestroy() {
super.onDestroy();
if(subscription!=null){
subscription.unsubscribe();
}
}
3-接收者活动或片段
private Subscription subscription;
public onCreate(Bundle savedInstanceState){
subscription = RxBus.getSubject()
.subscribe(new Subscriber<Object>() {
@Override
public void onNext(Object o) {
if (o instanceof MyData) {
Log.d("tag", (MyData)o.getData();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
我是这样做的,当我点击iPhone时,我有一些按钮,编辑文本,然后当我提交到主屏幕时。再次,当我单击列表中的其余项目时,我正在执行相同的操作。当我单击“所有信息”时,我需要将iPhone、BlackBerry、Android、Nokia数据发送到不同的活动。英译汉我不知道怎么做英译汉你能更详细地说明你面临的问题吗?你想实现什么?嘿,Kalyanganov Alexey,你能用一个简单的例子告诉我如何使用接口传递数据吗?舒尔。谷歌有很好的例子,但如果我只有最后一个片段中的一个按钮,我该怎么做呢?我试过你的解决办法。基本上它可以工作,但需要一些修改