将字符串从fragment_1传递到fragment_2的下一个代码如何工作?

时间:2016-04-08 16:43:38

标签: android interface

我一直在开发一个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();
    }

1 个答案:

答案 0 :(得分:1)

理解代码块如何工作的第一步是阅读它,为了阅读它,你必须遵守语言的标准;您的代码缺少的一些内容如下:

  • 压痕
  • 班级名称不应使用下划线(_)
  • 类名通常不是复数(Callback not Callbacks)
  • 类名必须大写(Fragment1而不是fragment1)
  • 必须在类(mCallback)
  • 中定义字段
  • 接口不得指定成员访问限定符(即没有私有,公共,受保护的声明)
  • 让我们看看您的代码现在的样子:

    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); 
            }
        }
    }
    

    重要说明:

  • 无需在父字段中存储上下文;您始终可以使用getActivity()方法访问父上下文。
  • 我正在删除Fragment2中的mCallback,因为如果要与MainActivity进行通信,则必须在Fragment2中指定自己的接口(即每个片段都有自己的接口以与活动进行通信)。
  • 最佳做法是通过将上下文转换为回调类型并在onDetach()上以下列方式将回调设置为null来初始化onAttach(Context context)方法中的mCallback:

    @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的书。