我试图在两个片段之间进行通信,但我只是一个初学者,所以我想知道是否有任何解决方案没有使用interface
....
如果有片段A,B及其活动:
我知道两个片段之间的直接通信几乎是不可能的,
但我认为这不会让我使用interface
。
此外,是否有任何方法可以使用putExtra()
作为片段?我只知道使用Serializable
。
答案 0 :(得分:1)
您可以使用EventBus直接在片段之间进行通信 - 通过一个片段发送普通或粘性事件,并在另一个片段中订阅该事件。 如果不希望消息丢失,请使用粘性事件 - 它在Android中用作粘性Intent。它将会被targer片段删除,或者因为另一个事件正在等待。
答案 1 :(得分:1)
查看Android deverlopers页面:http://developer.android.com/training/basics/fragments/communicating.html#DefineInterface
基本上,您在Fragment A中定义了一个接口,并让您的Activity实现该接口。现在,您可以调用Fragment中的接口方法,并且您的Activity将接收该事件。现在,在您的活动中,您可以调用第二个片段以使用收到的值
更新文本视图 // You Activity implements your interface
public class YourActivity implements FragmentA.TextClicked{
@Override
public void sendText(String text){
// Get Fragment B
FraB frag = (FragB)
getSupportFragmentManager().findFragmentById(R.id.fragment_b);
frag.updateText(text);
}
}
// Fragment A defines an Interface, and calls the method when needed
public class FragA extends Fragment{
TextClicked mCallback;
public interface TextClicked{
public void sendText(String text);
}
@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 = (TextClicked) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement TextClicked");
}
}
public void someMethod(){
mCallback.sendText("YOUR TEXT");
}
@Override
public void onDetach() {
mCallback = null; // => avoid leaking, thanks @Deepscorn
super.onDetach();
}
}
// Fragment B has a public method to do something with the text
public class FragB extends Fragment{
public void updateText(String text){
// Here you have it
}
}
答案 2 :(得分:0)
你可以从父活动类调用一个方法来调用片段B中的方法,如((YourActivity)getActivity()).callMethod(T yourData)
答案 3 :(得分:0)
是的,您可以使用bundle
在片段之间传输数据,就像使用putExtra
Bundle = bundle = new Bundle();
bundle.putString("key","value");
bundle.putSerializable("serialzedKey",SerializedValue);
FragmentTransaction fts = ((BaseActivity) mContext).getSupportFragmentManager().beginTransaction();
fragment.setArguments(bundle);
fts.add(R.id.fragmentHolder, fragment);
fts.addToBackStack(fragment.getClass().getSimpleName());
fts.commit();
在其他片段中,您可以使用getArguments()
String key = getArguments().getString("key");
SerializedModel = getArguments().getSerializable("serialzedKey");
答案 4 :(得分:0)
看看我的Github回购使用接口在片段之间进行通信。
这只是一个非常简单的例子,但显示了关键概念。