【Android开发】之Fragment与Acitvity通信

 

  上一篇我们讲到与Fragment有关的常用函数,既然Fragment被称为是“小Activity”,现在我们来讲一下Fragment如何与Acitivity通信。如果上一篇还有不懂得,可以再看一下。传送门

 

  Fragment与Activity通信的方式如下:

  一、通过初始化函数提供

    1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为Fragment提供数据;

     2.在Fragment中,在onAttach()函数中通过调用getArguments()获得一个Bundle对象,从而获取我们提供的数据。

 

  二、创建回调接口

    比如说:新闻浏览情境下,共有两个Fragment,一个是用来显示新闻标题;另外一个用来显示新闻内容。当我们点击新闻标题的时候,新闻的内容就显示到另外一个Fragment当中了。下面我们就来通过按下Fragment1中的button来传递一个消息到Fragment2中。

    首先我们要做的是,在Fragment1中创建一个回调接口,并且在Activity中重写他的方法,传递信息给Fragment2(举一反三:我们也可以传递给其他的Fragment)。

    下面我给出Fragment1的代码:

  1 package com.example.fragment;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.support.v4.app.Fragment;
  6 import android.util.AttributeSet;
  7 import android.util.Log;
  8 import android.view.LayoutInflater;
  9 import android.view.View;
 10 import android.view.View.OnClickListener;
 11 import android.view.ViewGroup;
 12 
 13 import com.example.fragmentdemo.R;
 14 
 15 public class Fragment1 extends Fragment {
 16 
 17     private static final String TAG = "FragmentDemo";
 18     private OnButtonClickListener mListener;
 19 
 20     /**
 21      * 这里我们创建一个回调接口
 22      * 
 23      * @author Myp
 24      * 
 25      */
 26     public interface OnButtonClickListener {
 27         public void onButtonClicked();
 28     }
 29 
 30     @Override
 31     public void onAttach(Activity activity) {
 32         Log.v(TAG, "Fragment1 onAttach");
 33         Bundle args = getArguments();
 34         if (null != args) {
 35             /*
 36              * 在这里我们可以将从Acivity收到的数据保存起来,并且显示到Fragment当中。
 37              */
 38             Log.d(TAG,
 39                     "Fragment1 Get data from activity "
 40                             + args.getString("hello"));
 41         }
 42 
 43         try {
 44             mListener = (OnButtonClickListener) activity;
 45         } catch (ClassCastException e) {
 46             throw new ClassCastException(activity.toString()
 47                     + " must implement OnButtonClickListener");
 48         }
 49         super.onAttach(activity);
 50     }
 51 
 52     @Override
 53     public void onInflate(Activity activity, AttributeSet attrs,
 54             Bundle savedInstanceState) {
 55         Log.d(TAG, "onInflate");
 56         super.onInflate(activity, attrs, savedInstanceState);
 57     }
 58 
 59     @Override
 60     public void onCreate(Bundle savedInstanceState) {
 61         Log.v(TAG, "Fragment1 onCreate");
 62         super.onCreate(savedInstanceState);
 63     }
 64 
 65     @Override
 66     public void onDestroy() {
 67         Log.v(TAG, "Fragment1 onDestroy");
 68         super.onDestroy();
 69     }
 70 
 71     @Override
 72     public void onResume() {
 73         Log.v(TAG, "Fragment1 onResume");
 74         super.onResume();
 75     }
 76 
 77     @Override
 78     public void onStart() {
 79         Log.v(TAG, "Fragment1 onStart");
 80         super.onStart();
 81     }
 82 
 83     @Override
 84     public void onDetach() {
 85         Log.v(TAG, "Fragment1 onDetach");
 86         super.onDetach();
 87     }
 88 
 89     @Override
 90     public void onPause() {
 91         Log.v(TAG, "Fragment1 onPause");
 92         super.onPause();
 93     }
 94 
 95     @Override
 96     public void onStop() {
 97         Log.v(TAG, "Fragment1 onStop");
 98         super.onStop();
 99     }
100 
101     @Override
102     public View onCreateView(LayoutInflater inflater, ViewGroup container,
103             Bundle savedInstanceState) {
104         Log.v(TAG, "Fragment1 onCreateView");
105         View view = inflater.inflate(R.layout.fragment1, container, false);
106         // 为button注册事件,并且调用回调接口,将信息返回给上层
107         view.findViewById(R.id.fragment1_btn).setOnClickListener(
108                 new OnClickListener() {
109                     @Override
110                     public void onClick(View v) {
111                         mListener.onButtonClicked();
112                     }
113                 });
114         return view;
115     }
116 
117     @Override
118     public void onDestroyView() {
119         Log.v(TAG, "Fragment1 onDestroyView");
120         super.onDestroyView();
121     }
122 
123     @Override
124     public void onActivityCreated(Bundle savedInstanceState) {
125         Log.v(TAG, "Fragment1 onActivityCreated");
126         super.onActivityCreated(savedInstanceState);
127     }
128 
129 }
View Code

     

    1.创建回调接口;

    2.为了确保宿主activity实现这个接口,fragment1的onAttach() 方法中通过将传入的activity强制类型转换,实例化一个OnButtonClickListener对象;

    3.注册Button的Click事件,并在事件中调用回调方法。

 

    然后我给出Activity的代码:

  1 package com.example.fragmentdemo;
  2 
  3 import android.annotation.SuppressLint;
  4 import android.os.Bundle;
  5 import android.support.v4.app.Fragment;
  6 import android.support.v4.app.FragmentActivity;
  7 import android.support.v4.app.FragmentTransaction;
  8 import android.util.Log;
  9 import android.widget.TextView;
 10 
 11 import com.example.fragment.Fragment1;
 12 import com.example.fragment.Fragment1.OnButtonClickListener;
 13 import com.example.fragment.Fragment2;
 14 
 15 @SuppressLint("Recycle")
 16 public class MainActivity extends FragmentActivity implements
 17         OnButtonClickListener {
 18 
 19     private static final String TAG = "FragmentDemo";
 20     private Fragment1 fragment1;
 21     private Fragment2 fragment2;
 22 
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         Log.i(TAG, "onCreate");
 26         super.onCreate(savedInstanceState);
 27         setContentView(R.layout.activity_main);
 28         fragment1 = new Fragment1();
 29         fragment2 = new Fragment2();
 30         addFragment1();
 31         addFragment2();
 32     }
 33 
 34     private void addFragment1() {
 35         Bundle args = new Bundle();
 36         args.putString("hello", "Hello Fragment1");
 37         fragment1.setArguments(args);
 38         Log.i(TAG, "create Fragment1");
 39         FragmentTransaction transaction = getSupportFragmentManager()
 40                 .beginTransaction();
 41         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
 42         transaction.add(R.id.one, fragment1);
 43         transaction.addToBackStack(null);
 44         transaction.commit();
 45     }
 46 
 47     private void addFragment2() {
 48         Bundle args = new Bundle();
 49         args.putString("hello", "Hello Fragment2");
 50         fragment2.setArguments(args);
 51         Log.i(TAG, "create Fragment2");
 52         FragmentTransaction transaction = getSupportFragmentManager()
 53                 .beginTransaction();
 54         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
 55         transaction.replace(R.id.two, fragment2);
 56         transaction.addToBackStack(null);
 57         transaction.commit();
 58     }
 59 
 60     @Override
 61     public void onAttachFragment(Fragment fragment) {
 62         Log.i(TAG, "onAttachFragment");
 63         super.onAttachFragment(fragment);
 64     }
 65 
 66     @Override
 67     protected void onDestroy() {
 68         Log.i(TAG, "onDestroy");
 69         super.onDestroy();
 70     }
 71 
 72     @Override
 73     protected void onPause() {
 74         Log.i(TAG, "onPause");
 75         super.onPause();
 76     }
 77 
 78     @Override
 79     protected void onResume() {
 80         Log.i(TAG, "onResume");
 81         super.onResume();
 82     }
 83 
 84     @Override
 85     protected void onStart() {
 86         Log.i(TAG, "onStart");
 87         super.onStart();
 88     }
 89 
 90     @Override
 91     protected void onStop() {
 92         Log.i(TAG, "onStop");
 93         super.onStop();
 94     }
 95 
 96     @Override
 97     protected void onRestart() {
 98         Log.i(TAG, "onRestart");
 99         super.onRestart();
100     }
101 
102     @Override
103     public void onButtonClicked() {
104         Log.i(TAG, "onButtonClicked");
105         TextView tv = (TextView) fragment1.getActivity().findViewById(
106                 R.id.fragment2_tv);
107         tv.setText(tv.getText() + "\n从Fragment1收到数据!");
108     }
109 }
View Code

 

    1.通过implements实现回调接口;

    2.重写回调方法,然后向Fragment2传递数据。

 

  三、源码下载

    点我下载,下载源码导入工程就可以使用了!

 

  接下来可能会介绍一下Fragment的动画效果,有兴趣的可以关注一下。我的CSDN博客:http://blog.csdn.net/u010049692/article/details/38979607

 

posted @ 2014-09-01 14:11  gether  阅读(2394)  评论(0编辑  收藏  举报