在我的应用中,我有两个片段说 fragmentA 和 FragmentB 。当我点击 fragmetA 中的按钮时,会在 fragmentB 中打开一个列表。现在,当我从 fragmentB 的列表中选择一个项目时,我希望将结果传递给 fragmentA 。我只对所有片段使用一个TabActivity。当在 fragmentB 中选择列表项时,我会从堆栈中弹出 fragmentB ,以便我可以直接返回 fragmentA 。
有谁知道如何将结果传递给之前的片段。
感谢。
答案 0 :(得分:18)
<强>更新强>
Activity是父controller,应该负责处理由其片段/视图引发的事件,这些事件涉及片段/视图本身范围之外的事情。
片段将作为其托管的sub-controller视图。所有事件和它自己的观点之间的沟通,片段应该处理自己。如果在片段的范围和职责之外存在事件(例如将数据发送到另一个片段),则应将该事件升级到其父控制器Activity。
<强>旧强>
从本教程:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
最好让活动对其片段应用更改,而不是直接在片段之间传递值。让您的Activity使用FragmentListener
和onQuery(Bundle data)
方法实现onResult(Bundle data)
界面。
在每个片段中创建FragmentListener
变量,然后覆盖每个片段的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.");
}
}
这将强制您的子片段自动注册到父Activity。
另外,请记得在fragmentListener
中发布onDetach()
引用。
现在您可以从片段中调用您的活动。
另一方面,您的活动始终可以使用getFragmentManager().findFragmentByTag("fragmentA")
或findFragmentById("FragmentA")
搜索片段。
如果它可以找到你的片段,那么它可以将它转换为你的FragmentA
类并调用它的方法。可以使用FragmentB
或任何其他片段进行相同的操作..
答案 1 :(得分:7)
可能的解决方案之一:
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);
}
}
}
第一个片段实现DetachableResultReceiver.Receiver并创建DetachableResultReceiver对象:
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);
答案 2 :(得分:0)
在fragmentB.java中设置OnClickListener以在主类中执行方法。将fragmentB.java中的争论传递给作为变量的主类,并在主类中处理其余部分。虽然片段根本不应该依赖于活动。片段可以在任何地方进行即插即用。
此示例显示EditTextListener:
myAwesomeActivity.java
fragmentA.java
fragmentB.java
<强> fragmentB.java:强>
@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
}
您所要做的就是实现正确类型的侦听器,但显示的是主要内容。在一个片段活动中,调用方法并将变量传递给主活动。如果您愿意,可以从主活动中将其发送到您的其他片段活动。
答案 3 :(得分:0)
您也可以使用SharedPreferences
保存一些字符串,并在返回第一个片段后加载并清除。