我知道的一种方法是通过活动。我们可以将数据从一个片段发送到另一个活动,再从一个活动发送到另一个片段。还有其他方法吗?
我认为有两种方法可行:
A、 与您所属的活动进行通信,并通过该所属活动将消息转发给其他片段,有关详细信息,请参阅以下android官方文档:
http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
引述:
在某些情况下,您可能需要一个片段来与活动共享事件。这样做的一个好方法是在片段内定义回调接口,并要求宿主活动实现它。当活动通过接口接收到回调时,它可以根据需要与布局中的其他片段共享信息。
通信界面可以如下所示:
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.");
}
}
}
我在这里使用的是一个弱引用,但这实际上取决于你。您现在可以使用actionCallback与拥有的活动进行通信,并调用IActionListener中定义的方法。
拥有的活动如下所示:
public class MyActivity extends ActionBarActivity implements IActionListener {
public void doSomething(){ //Here you can forward information to other fragments }
}
B.现在对于第二种方法——您也可以让片段使用接口直接相互通信——这样您就不必知道您正在交谈的片段的确切类别,这确保了松散耦合。
设置如下:您有两个片段(或更多)和一个活动(启动第二个片段)。我们有一个接口,可以让片段2在完成任务后向片段1发送响应。为了简单起见,我们只是重用我在A中定义的接口。
这是我们的片段1:
public class FragmentOne extends Fragment implements IActionListener {
public void doSomething() {//The response from Fragment 2 will be processed here}
}
使用A中描述的方法。片段1要求它拥有活动来启动片段2。但是,活动将把片段1作为参数传递给片段2,因此片段2稍后可以间接访问片段1并发送回复。让我们看看活动如何准备片段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();
}
}
提示:我使用的是支持框架,因此如果您只为
现在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()的实现。
引用文档
通常您会希望一个片段与另一个片段通信,例如根据用户事件更改内容。所有片段到片段的通信都是通过关联的活动完成的。两个片段永远不应该直接通信。
我建议您按照文档中的方法操作,我没有尝试过其他方法
有关更多信息和示例,请访问以下链接中的文档
http://developer.android.com/training/basics/fragments/communicating.html
将数据从一个片段传递到另一个Bundle
会有所帮助。
LifeShapeDetailsFragment fragment = new LifeShapeDetailsFragment(); // object of next fragment
Bundle bundle = new Bundle();
bundle.putInt("position", id);
fragment.setArguments(bundle);
然后推送/调用下一个Fragments。
并编码到下一个片段:
Bundle bundle = this.getArguments();
int myInt = bundle.getInt("position", 0);
我有两个活动,在活动1中有碎片,在活动2中有碎片 fragment1和fragment2扩展自FragmentActivity1,activity2扩展自AppCompatActivity 我想将字符串值从fragment1发送到fragment2,而不获取空值。我希望你能理解这个问题。谢谢
在FragmentOne.class扩展android.support.v4.app.
这是我完整的logcat: 在Android.support.v4.app.backStackRecord.doaddop(backStackRecord.java:414)在Android.support.v4.app.backStackRecord.replace(backStackRecord.java:449)在Android.support.v4.app.backStackRecord.
我在一个片段中有一个复选框列表(我们称之为FragmentA),我有一个包含两个片段(FragmentB和C)的活动。如果选中一个复选框,我想在片段C中显示一条消息,说明选中了特定的复选框。我需要帮助,因为我不知道如何将(isChecked)从片段A传递到片段C。 FragmentA.java 分数不影响碎片C。 包含片段 B 和 C 的活动 片段C 活动
先生/女士,我想使用android JAVA将一个片段回调到另一个片段。我试图找到问题,但没有找到解决方案。若我使用接口,它会向活动发送回调响应,这是我不想要的。非常感谢。
我找到了这段代码来将数据从一个片段传递到另一个片段: 片段1: 片段2: 但我不想改变片段。所以我拆了一部分。但这不起作用。这里是我的代码: 片段1: 片段2: 我必须使用我在网上找到的代码还是我的版本也能工作?当我打开第二个片段时会出现这个错误: E/AndroidRuntime:致命异常:主进程:com.example.rexan_snerficonquiz.fragment_score.on