详解Fragment跟Activity之间的通信

大家好.Fragment现在越来越广泛了,中文翻译为碎片,下面我就就碎片代替了,当时谷歌出碎片的原因是因为Android设备屏幕大小不统一,碎片出来了.用一套APP就可以解决平板跟手机上的UI问题.对于新手让碎片跟Activity交互很困难,因为碎片是依附在Activity上面的,他们不是一个整体,好,废话少说,让我们看看到底如何让碎片跟Activity交互.

我是这样的设计的,在Activity里面一个Button,点击这个Button让下面的碎片显示一段文件,当这段文字显示出来以后碎片里面也有个Button,点击碎片里面的这个Button让Activity换个碎片.

首先我先在Activity定义接口和一个Handler,接口的作用是让碎片接收Activity的指令,而Handler用于接收碎片传来的指令,Activity在执行操作.如下所示:

 

[java] view plain copy
 
  1. package com.example.fragmentactivity;  
  2.   
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.Message;  
  6. import android.app.Activity;  
  7. import android.support.v4.app.Fragment;  
  8. import android.support.v4.app.FragmentActivity;  
  9. import android.support.v4.app.FragmentTransaction;  
  10. import android.view.Menu;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14. import android.widget.FrameLayout;  
  15.   
  16. public class MainActivity extends FragmentActivity implements OnClickListener {  
  17.     private Button button1;  
  18.     private String fragmentName;  
  19.     private OnButtonClickedListener buttonClickedListener;  
  20.     /** 
  21.      * 定义一个Handler用于接收黄色碎片给Activity发出来的指令 
  22.      */  
  23.     public Handler handler=new Handler(){  
  24.         @Override  
  25.         public void handleMessage(Message msg) {  
  26.             super.handleMessage(msg);  
  27.             if(msg!=null){  
  28.                 switch (msg.what) {  
  29.                 case 100:  
  30.                     /** 
  31.                      * 接收到黄色碎片发来的指令,Activity执行替换操作 
  32.                      */  
  33.                     fragmentName=Fragment2.class.getName();  
  34.                     replaceFragment(R.id.FrameLayout1, fragmentName);  
  35.                     break;  
  36.   
  37.                 default:  
  38.                     break;  
  39.                 }  
  40.             }  
  41.         }  
  42.           
  43.     };  
  44.     @Override  
  45.     protected void onCreate(Bundle savedInstanceState) {  
  46.         super.onCreate(savedInstanceState);  
  47.         setContentView(R.layout.activity_main);  
  48.         button1=(Button) findViewById(R.id.button1);  
  49.         button1.setOnClickListener(this);  
  50.         /** 
  51.          * 加载黄色碎片 
  52.          */  
  53.         fragmentName=Fragment1.class.getName();  
  54.         replaceFragment(R.id.FrameLayout1, fragmentName);  
  55.     }  
  56.   
  57.     @Override  
  58.     public void onClick(View v) {  
  59.         switch (v.getId()) {  
  60.         case R.id.button1:  
  61.             if(buttonClickedListener!=null){  
  62.                 buttonClickedListener.onclicked("Activity:我不想要这个黄色碎片了,点击下面的按钮给我换个绿色的碎片");  
  63.             }  
  64.             break;  
  65.         default:  
  66.             break;  
  67.         }  
  68.   
  69.     }  
  70.     /* 
  71.      *  
  72.      * 加载碎片 
  73.      */  
  74.     protected void replaceFragment(int viewResource, String fragmentName) {  
  75.         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  
  76.         Fragment fragment = Fragment.instantiate(this, fragmentName);  
  77.         ft.replace(viewResource, fragment);  
  78.         ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);  
  79.         ft.commit();  
  80.         getSupportFragmentManager().executePendingTransactions();  
  81.     }  
  82.     /** 
  83.      * 定义一个接口 
  84.      * @author zqy 
  85.      * 
  86.      */  
  87.     public  interface OnButtonClickedListener{  
  88.         /** 
  89.          * 里面传个值 
  90.          * @param s 
  91.          */  
  92.             public void onclicked(String s);  
  93.     }  
  94.     /** 
  95.      *  
  96.      * @param buttonClickedListener 
  97.      * 写一个对外公开的方法 
  98.      */  
  99.     public void setButtonClickedListener(OnButtonClickedListener buttonClickedListener){  
  100.         this.buttonClickedListener=buttonClickedListener;  
  101.     }  
  102.   
  103.   
  104.       
  105.       
  106. }  

这就是Activity里面的代码,我们在去写两个碎片如下所示:

 

Fragment1:

 

[java] view plain copy
 
  1. package com.example.fragmentactivity;  
  2.   
  3.   
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.support.v4.app.Fragment;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.view.ViewGroup;  
  12. import android.widget.Button;  
  13. import android.widget.TextView;  
  14. import android.widget.Toast;  
  15.   
  16. import com.example.fragmentactivity.MainActivity.OnButtonClickedListener;  
  17.   
  18. public class Fragment1 extends Fragment implements OnClickListener {  
  19.     private TextView textView;  
  20.     private Button button;  
  21.     private Handler handler;  
  22.     @Override  
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         MainActivity activity=(MainActivity) getActivity();  
  26.         /** 
  27.          * 得到Activity的Handler 
  28.          */  
  29.         handler=activity.handler;  
  30.         /** 
  31.          * 加监听 
  32.          */  
  33.         activity.setButtonClickedListener(new OnButtonClickedListener() {  
  34.               
  35.             @Override  
  36.             public void onclicked(String s) {  
  37.                 /* 
  38.                  * 显示Activity传来的内容 
  39.                  */  
  40.                 textView.setText(s);  
  41.                 button.setVisibility(View.VISIBLE);  
  42.             }  
  43.         });  
  44.     }  
  45.     @Override  
  46.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  47.             Bundle savedInstanceState) {  
  48.         return inflater.inflate(R.layout.item1, null);  
  49.     }  
  50.     @Override  
  51.     public void onActivityCreated(Bundle savedInstanceState) {  
  52.         super.onActivityCreated(savedInstanceState);  
  53.         textView=(TextView) getActivity().findViewById(R.id.textView1);  
  54.         button=(Button) getActivity().findViewById(R.id.button2);  
  55.         button.setOnClickListener(this);  
  56.     }  
  57.     @Override  
  58.     public void onClick(View v) {  
  59.         switch (v.getId()) {  
  60.         case R.id.button2:  
  61.             /** 
  62.              * 发送指令到Activity 
  63.              */  
  64.             handler.sendEmptyMessage(100);  
  65.             break;  
  66.   
  67.         default:  
  68.             break;  
  69.         }  
  70.     }  

 

这个碎片让它的Activity实现这个接口,在把接口里面的值显示到页面上,在点击这个碎片里面的Button给它的Activity发送一个消息.这里面我发的是100.

Fragment2:

 

[java] view plain copy
 
  1. package com.example.fragmentactivity;  
  2.   
  3.   
  4. import android.os.Bundle;  
  5. import android.support.v4.app.Fragment;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9.   
  10. public class Fragment2 extends Fragment {  
  11.     @Override  
  12.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  13.             Bundle savedInstanceState) {  
  14.         // TODO Auto-generated method stub  
  15.         return inflater.inflate(R.layout.item2, null);  
  16.     }  
  17. }  

这就写完了.以后的项目在也不怕碎片跟Activity通信了,下面来一张效果图,UI比较难看,哈哈,不会的可以在下面留言,我会把Demo给你们传到资源上,供你们下载,谢谢!

 

源码下载,请点击这里

posted @ 2016-12-30 11:21  天涯海角路  阅读(99)  评论(0)    收藏  举报