Fragment向activity传值的接口回调方法

activity和fragment之间的数据传递主要分为三种:

 (1) Activity传递数据给Fragment

Activity中创建Bundle数据包,调用Fragment实例的setArguments(bundle) 从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments获得 Bundle对象,然后进行解析就可以了
(2) Fragment传递数据给Activity

(3)  Fragment 与Fragment之间传递数据

其实这很简单,找到要接受数据的fragment对象,直接调用setArguments传数据进去就可以了 通常的话是replace时,即fragment跳转的时候传数据的,那么只需要在初始化要跳转的Fragment 后调用他的setArguments方法传入数据即可!
如果是两个Fragment需要即时传数据,而非跳转的话,就需要先在Activity获得f1传过来的数据, 再传到f2了,就是以Activity为媒介~

今天主要介绍第二种传值方式Fragment向activity传值。这种传值方式用到了接口回调的方法

主要分为三步

  •  Step 1:定义一个回调接口:(Fragment中)

  •  
         
    /*接口*/  
    public interface CallBack{  
       /*定义一个获取信息的方法*/  
       public void getResult(String result);  
  •   Step 2:接口回调(Fragment中)

  •  
         
    /*接口回调*/  
    public void getData(CallBack callBack){  
       /*获取文本框的信息,当然你也可以传其他类型的参数,看需求咯*/  
       String msg = editText.getText().toString();  
       callBack.getResult(msg);  
  •   Step 3:使用接口回调方法读数据(Activity中)

  •  
         
    /* 使用接口回调的方法获取数据 */  
    leftFragment.getData(new CallBack() {  
    @Override  
          public void getResult(String result) {              /*打印信息*/  
               Toast.makeText(MainActivity.this, "-->>" + result, 1).show();  
               }
           });
上述代码看不懂的接下来我们以一个实例来进行讲解

在fragment中

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main,null);
        Button button = (Button) view.findViewById(R.id.btn_click);
        button.setOnClickListener(this);

        editText = (EditText)view.findViewById(R.id.et_content);
        return view;
    }


    @Override
    public void onClick(View v) {
        //获取EditText里面的输入值
        content = editText.getEditableText().toString();
        //调用这个接口方法
        callback.getResult(content);
    }

    //步骤1:定义一个回调接口
    public interface CallBack{
        public void getResult(String content);
    }

    //步骤2:设置监听器
    public void setCallBack(CallBack callBack) {
        this.callback = callBack;
    }

在Activity中

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MainFragment fragment = (MainFragment) getFragmentManager().findFragmentById(R.id.fragment_main);
        //步骤3:设置监听器,实现接口里面的方法
        fragment.setCallBack(this);

        tvShow = (TextView)findViewById(R.id.tv_show);
    }

    @Override
    public void getResult(String content) {
        tvShow.setText(content);
    }

其中步骤2,3也可以合并为一步

在Fragment中重写OnAttach()方法

public void OnAttach(Activity activity){
   callback =(CallBack)getActivity;
}
 Activity在加载fragment时会调用OnAttach方法,这样也能达到设置监听的目的 
  


在学习过程中还发现了另一种传递数据的方式就是采用Intent传值,在Fragment中使用Intent传值,并跳转到Activity中,在activity中依然能够接收到数据。


比如:

在Fragment中设置一个按钮的监听,点击的时候跳转并进行传值

 
    {
  Intent intent=new Intent();
        intent.setClass(getActivity(), MainActivity2.class);
        Bundle bundle=new Bundle();
        bundle.putString("name","Jack");
        intent.putExtras(bundle);
        startActivity(intent);
    }

在Activity中进行接收,并打印结果

  Intent intent=getIntent();
        Bundle bundle = intent.getExtras();
        String name=bundle.getString("name");
        Log.i("------->", "onCreate: "+name);
结果如下,显示传值成功。
03-11 20:52:51.785 24433-24433/com.wangdong.fragmenttest I/------->: MainActivity2 onCreate: Jack






你可能感兴趣的:(Fragment向activity传值的接口回调方法)