在我的应用程序中,我有两个片段,分别是fragmentA和FragmentB。当我点击fragmetA中的按钮时,fragmentB中会打开一个列表。现在,当我从fragmentB中的列表中选择一个项目时,我希望将结果传递给fragmentA。我只对所有片段使用一个TabActivity。当列表项在fragmentB中被选中时,我将从堆栈中弹出fragmentB,以便直接返回fragmentA。
有人知道如何将结果传递给前一个片段吗。
谢谢
在片段B中。java设置OnClickListener以在主类中执行方法。以零碎的形式通过辩论。java调用作为变量的主类,并在主类中处理它的其余部分。尽管片段不应该真正依赖于活动。碎片可以在任何地方即插即用。
此示例显示EditTextListener:
我的惊人活动。JAVA
java文档
碎片B。JAVA
碎片B。爪哇:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
int x = 3;
EditText ed1 = (EditText) getView().findViewById(R.id.editText1);
ed1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEvent.ACTION_UP == event.getAction()) {
((myAwesomeActivity) getActivity()).myMethod(x);
}
return false;
}
});
}
myAwesomeActivity.java:
publiv void myMethod (int x){
//Do whatever you want with variable
}
您所要做的就是实现正确类型的侦听器,但是要点已经显示出来了。在一个片段活动中,调用一个方法并向主活动传递一个变量。如果您愿意,您可以从主活动将它发送到您的其他片段活动。
可能的解决方案之一:
public class DetachableResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public DetachableResultReceiver(Handler handler) {
super(handler);
}
public void clearReceiver() {
mReceiver = null;
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
}
第一个片段实现了DetaccableResultReceiver。接收器并创建可分离的ResultReceiver对象:
mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);
然后可以将其传递给第二个片段参数:
Bundle bundle = new Bundle();
bundle.putParcelable(Consts.EXTRA_RECEIVER, receiver);
fragment.setArguments(bundle);
在第二段中使用:
receiver = getArguments().getParcelable(Consts.EXTRA_RECEIVER);
receiver.send(Consts.SOME_MESSAGE, someData);
更新
活动是父控制器,应该负责处理由其片段/视图引发的事件,这些事件涉及片段/视图本身范围之外的内容。
片段将充当它所承载的视图的子控制器。所有事件和它自己视图之间的通信,片段都应该自己处理。当有一个事件超出了片段的范围和职责(比如向另一个片段发送数据)时,该事件应该升级到它的父控制器活动。
古老的
从本教程中:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
与其在片段之间直接传递值,不如让活动对其片段应用更改。让您的活动使用onQuery(Bundle data)
和onResult(Bundle data)
方法实现一个FragmentListener
接口。
在每个片段中创建FragmentListener
varaible,然后将每个片段的onattach()
重写为:
public void onAttach(Activity activity) {
super.onAttach(activity);
//---register parent activity for events---
try{
fragmentListener = (FragmentListener) activity;
}catch (ClassCastException e)
{
throw new ClassCastException("Parent activity must implement interface FragmentListener.");
}
}
这将强制您的子片段自动注册到父活动。
另外,请记住在ondeach()
中释放fragmentListener
引用。
现在,您可以从片段调用您的活动。
另一方面,您的活动总是可以使用getFragmentManager(). findFragmentByTag("片段A")
或findFragmentById("片段A")
搜索片段。如果它能找到您的片段,那么它可以将其强制转换到您的FragmentA
类中并调用其方法。FragmentB
或任何其他片段也可以这样做...
我有一个事件序列,通过它,我已经将三个片段一个接一个地添加到背景堆栈中。这些片段,每一个都覆盖了活动的全屏。 我已经存储了从Frag1的提交返回。 现在在Frag3中,基于特定的单击,我想直接回到Frag1并丢弃/弹出之间的所有Fragments。 因此,单击此按钮时,我会向活动发送一条消息,该消息执行以下操作: 但我只是得到一个空白屏幕,所以我假设没有加载碎片。 我甚至试过:在commit-
这是我完整的logcat: 在Android.support.v4.app.backStackRecord.doaddop(backStackRecord.java:414)在Android.support.v4.app.backStackRecord.replace(backStackRecord.java:449)在Android.support.v4.app.backStackRecord.
我有两个活动,在活动1中有碎片,在活动2中有碎片 fragment1和fragment2扩展自FragmentActivity1,activity2扩展自AppCompatActivity 我想将字符串值从fragment1发送到fragment2,而不获取空值。我希望你能理解这个问题。谢谢
我找到了这段代码来将数据从一个片段传递到另一个片段: 片段1: 片段2: 但我不想改变片段。所以我拆了一部分。但这不起作用。这里是我的代码: 片段1: 片段2: 我必须使用我在网上找到的代码还是我的版本也能工作?当我打开第二个片段时会出现这个错误: E/AndroidRuntime:致命异常:主进程:com.example.rexan_snerficonquiz.fragment_score.on
在FragmentOne.class扩展android.support.v4.app.
作为传递图像视图。它得到错误。