我一直在开发一个android项目,我有从一个片段到另一个片段的传递信息的必要性,我找到了这个代码,但我一直在理解它是如何工作的。
下一个代码使用接口
将信息从fragment_1传递到fragment_2当对象mCallbacks获取Activity时,我不是特别理解该部分。 (mCallbacks =(Callbacks)getActivity();) 以及Fragment_1具有的对象mCallbacks如何调用MainActivity上的接口。
注意:我会把所有的代码都放进去,也许它可以帮助别人。
private Callbacks mCallbacks = null;
public class frament_1 extends Fragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCallbacks = (Callbacks)getActivity();//****************************
}
Public interface Callbacks{
public void callMethodOnMainActivity(String folio);
}
Public void passInformationToFragment2(){
mCallbacks.callMethodOnMainActivity("This String is passed using interfaces"); //****************************+
}
}
这是实现frament_1具有的接口的MainActivity。
public class MainActivity extends Activity implements fragment_1.Callbacks{
@Override
public void callMethodOnMainActivity(String folio) {//*********************
//here you call the fragment_2 and pass the String has parameter.
// no problem wthis part
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment module = fragment_2.newInstance(this, folio);
fragmentManager.beginTransaction().replace(R.id.MainContent, module).commit();
}
}
Fragment_2
public class Fragment_2 extends Fragment{
public static Fragment_2 newInstance (Context c, String folio){
//folio has the String passed
Fragment_2 fragment = new Fragment_2();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, folio);
fragment.setArguments(args);
parent = c;
return fragment;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
//Here you get the parameter that ARG_PARAM1
String folio = getArguments().getString(ARG_PARAM1);
}
mCallbacks = (Callbacks) this.getActivity();
}
答案 0 :(得分:1)
理解代码块如何工作的第一步是阅读它,为了阅读它,你必须遵守语言的标准;您的代码缺少的一些内容如下:
让我们看看您的代码现在的样子:
public class Fragment1 extends Fragment {
private MyCallback mCallback = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCallback = (MyCallback) getActivity();
}
public interface MyCallback{
void callMethodOnMainActivity(String folio);
}
public void passInformationToFragment2(){
mCallback.callMethodOnMainActivity("This String is passed using interfaces");
}
}
public class Fragment2 extends Fragment {
public static final String ARG_PARAM_FOLIO = "param_folio";
public static Fragment2 newInstance(String folio) {
Fragment2 fragment = new Fragment2();
Bundle args = new Bundle()
args.putString(ARG_PARAM_FOLIO, folio);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
String folio = getArguments().getString(ARG_PARAM_FOLIO);
}
}
}
重要说明:
@Override
public void onAttach(Context context) {
super(context);
try {
mCallback = (MyCallback) context;
} catch (ClassCastException e) {
throw new IllegalArgumentException(this.getClassName() + " must implement MyCallback";
}
}
@Override
public void onDetach() {
super();
mCallback = null;
}
现在,让我们看看MainActivity代码,看看实际在做什么:
public class MainActivity extends Activity implements Fragment1.MyCallback {
@Override
public void callMethodOnMainActivity(String folio) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = Fragment2.newInstance(this, folio);
fragmentManager.beginTransaction().replace(R.id.MainContent, fragment).commit();
}
}
callMethodOnMainActivity(String folio)基本上用Fragment2替换屏幕上的当前片段(Fragment1),我在其中传递作品集作为参数。所以,没有什么神奇之处;但它是如何触发的?好吧,Fragment2有一个MyCallback类型的字段mCallback,它被初始化为MainActivity。因此,当您在Fragment1上调用mCallback.callMethodOfMainActivity(String folio)时,您在某种程度上告诉程序执行MainActivity中定义的方法callMethodOfMainActivity。
更熟悉Observable / Observer模式可能会有所帮助(你可以谷歌这个或者看看Gang of Four的书。