安卓回调方法的使用

http://blog.csdn.net/wangjinyu501/article/details/22052187

  在Android中到处可见接口回调机制,尤其是UI事件处理方面。举一个最常见的例子button点击事件,button有一个点击方法onClick(),我们知道onclick()是一个回调方法,当用户点击button就执行这个方法。在源码中是这样定义的:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //这个是View的一个回调接口  
  2. /**  
  3. * Interface definition for a callback to be invoked when a view is clicked.  
  4. */  
  5. public interface OnClickListener {  
  6.     /**  
  7.      * Called when a view has been clicked.  
  8.      *  
  9.      * @param v The view that was clicked.  
  10.      */  
  11.     void onClick(View v);  
  12. }  
  
 下面看一个简单的例子:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.View;  
  4. import android.view.View.OnClickListener;  
  5. import android.widget.Button;  
  6. import android.widget.Toast;  
  7.   
  8. public class MainActivity extends Activity implements OnClickListener{  
  9.   
  10.      private Button button;  
  11.   
  12.      @Override  
  13.      public void onCreate(Bundle savedInstanceState) {  
  14.           super.onCreate(savedInstanceState);  
  15.           setContentView(R.layout.activity_main);  
  16.           button = (Button)findViewById(R.id.button1);  
  17.             
  18.           
  19.           button.setOnClickListener(this);  
  20.      }  
  21.   
  22.      @Override  
  23.      public void onClick(View v) {  
  24.           Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show();  
  25.      }  
  26.   
  27. }  
  28.     这就是一个很典型的例子,当然也可以这样写:  
  29. import android.app.Activity;  
  30. import android.os.Bundle;  
  31. import android.view.View;  
  32. import android.view.View.OnClickListener;  
  33. import android.widget.Button;  
  34.   
  35. public class SSSS extends Activity {  
  36.   
  37.      private Button button;  
  38.      private OnClickListener clickListener = new OnClickListener() {  
  39.   
  40.           @Override  
  41.           public void onClick(View v) {  
  42.                // TODO Auto-generated method stub  
  43.   
  44.           }  
  45.      };  
  46.   
  47.      @Override  
  48.      protected void onCreate(Bundle savedInstanceState) {  
  49.           // TODO Auto-generated method stub  
  50.           super.onCreate(savedInstanceState);  
  51.           button = (Button)findViewById(R.id.button1);  
  52.           button.setOnClickListener(clickListener);    
  53.      }  
  54.   
  55. }  
  
 下面是View类的setOnClickListener方法,把和回调相关代码贴出来。什么贴它呢,因为Button继承于TextView,而TextView继承于View,在View里面处理的回调:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2. *  
  3. */  
  4. public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {  
  5.      /**  
  6.      * Listener used to dispatch click events.  
  7.      * This field should be made private, so it is hidden from the SDK.  
  8.      * {@hide}  
  9.      */  
  10.     protected OnClickListener mOnClickListener;  
  11.      
  12.     /**  
  13.      *  
  14.      * Register a callback to be invoked when this view is clicked. If this view is not  
  15.      * clickable, it becomes clickable.  
  16.      *  
  17.      * @param l The callback that will run  
  18.      *  
  19.      * @see #setClickable(boolean)  
  20.      */  
  21.      
  22.     public void setOnClickListener(OnClickListener l) {  
  23.         if (!isClickable()) {  
  24.             setClickable(true);  
  25.         }  
  26.         mOnClickListener = l;  
  27.     }  
  28.      
  29.      
  30.     /**  
  31.      * Call this view's OnClickListener, if it is defined.  
  32.      *  
  33.      * @return True there was an assigned OnClickListener that was called, false  
  34.      *         otherwise is returned.  
  35.      */  
  36.     public boolean performClick() {  
  37.         sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);  
  38.   
  39.         if (mOnClickListener != null) {  
  40.             playSoundEffect(SoundEffectConstants.CLICK);  
  41.              
  42.             mOnClickListener.onClick(this);  
  43.             return true;  
  44.         }  
  45.   
  46.         return false;  
  47.     }  
  48. }  
  
那现在一起来总结一下基本的回调是如何实现的,首先创建一个接口,这个接口用于你在某个情景下执行相应的操作。接着创建一个功能类,比如这个类可以显示一个对话框、可以滑动菜单、可以下载数据等等。然后,在这个类里面声明回调接口的对象,之后在这个类里面创建在某个情景下需要执行的方法,而且在这个方法里面为声明的接口对象赋值。最后在其他的类中使用这个功能类就可以了。所以说,最少也是需要三个类共同来完成这个回调机制。
    这下大家应该就比较明白了,那我们就自己按照这个方式和流程完成一个这样的例子。以Dialog为例,一般我们在开发时候,经常会用到Dialog。比如一个弹出框,里面有确认和取消。通常情况下,我们可能会这样写:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. final Dialog dialog = new Dialog(this, R.style.MyDialogStyle);  
  2.          dialog.setContentView(R.layout.dialog_exit_train);  
  3.          dialog.show();  
  4.          ImageButton ib_affirm = (ImageButton) dialog  
  5.                    .findViewById(R.id.dialog_exit_ib_affirm);  
  6.          ImageButton ib_cancel = (ImageButton) dialog  
  7.                    .findViewById(R.id.dialog_exit_ib_cancel);  
  8.   
  9.          ib_affirm.setOnClickListener(new View.OnClickListener() {  
  10.   
  11.               @Override  
  12.               public void onClick(View v) {  
  13.   
  14.                    saveUserData();  
  15.                    dialog.dismiss();  
  16.                    TestActivity.this.finish();  
  17.               }  
  18.          });  
  19.   
  20.          ib_cancel.setOnClickListener(new View.OnClickListener() {  
  21.   
  22.               @Override  
  23.               public void onClick(View v) {  
  24.   
  25.                    dialog.dismiss();  
  26.               }  
  27.          });  
  
也就是得到点击对象之后再去调用 onClick(),这样有一个缺点就是你每次都要写,不利于重复使用。那我们就可以对此进行一个封装,看代码:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.app.Dialog;  
  2. import android.content.Context;  
  3. import android.os.Bundle;  
  4. import android.text.TextPaint;  
  5. import android.view.View;  
  6. import android.view.Window;  
  7. import android.view.WindowManager;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. import com.fanfou.app.opensource.R;  
  12.   
  13. /**  
  14. *   
  15. *  
  16. */  
  17. public class AlertInfoDialog extends Dialog implements View.OnClickListener {  
  18.     //创建接口  
  19.     public static interface OnOKClickListener {  
  20.         public void onOKClick();  
  21.     }  
  22.   
  23.     private final Context mContext;  
  24.     private TextView mTitleView;  
  25.     private TextView mTextView;  
  26.   
  27.     private Button mButtonOk;  
  28.     private CharSequence mTitle;  
  29.   
  30.     private CharSequence mText;  
  31.     //生命接口对象  
  32.     private OnOKClickListener mClickListener;  
  33.   
  34.     public AlertInfoDialog(final Context context, final String title,  
  35.             final String text) {  
  36.         super(context, R.style.Dialog);  
  37.         this.mContext = context;  
  38.         this.mTitle = title;  
  39.         this.mText = text;  
  40.     }  
  41.   
  42.     private void init() {  
  43.         setContentView(R.layout.dialog_alert);  
  44.   
  45.         this.mTitleView = (TextView) findViewById(R.id.title);  
  46.         final TextPaint tp = this.mTitleView.getPaint();  
  47.         tp.setFakeBoldText(true);  
  48.         this.mTitleView.setText(this.mTitle);  
  49.   
  50.         this.mTextView = (TextView) findViewById(R.id.text);  
  51.         this.mTextView.setText(this.mText);  
  52.   
  53.         this.mButtonOk = (Button) findViewById(R.id.button_ok);  
  54.         this.mButtonOk.setOnClickListener(this);  
  55.   
  56.     }  
  57.   
  58.     @Override  
  59.     public void onClick(final View v) {  
  60.         final int id = v.getId();  
  61.         switch (id) {  
  62.         case R.id.button_ok:  
  63.             cancel();//调用  
  64.             if (this.mClickListener != null) {  
  65.                 this.mClickListener.onOKClick();  
  66.             }  
  67.             break;  
  68.         default:  
  69.             break;  
  70.         }  
  71.     }  
  72.   
  73.     @Override  
  74.     protected void onCreate(final Bundle savedInstanceState) {  
  75.         super.onCreate(savedInstanceState);  
  76.         setBlurEffect();  
  77.         init();  
  78.     }  
  79.   
  80.     protected void setBlurEffect() {  
  81.         final Window window = getWindow();  
  82.         final WindowManager.LayoutParams lp = window.getAttributes();  
  83.         // lp.alpha=0.8f;  
  84.         lp.dimAmount = 0.6f;  
  85.         window.setAttributes(lp);  
  86.         window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);  
  87.         // window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);  
  88.     }  
  89.   
  90.     public void setMessage(final CharSequence message) {  
  91.         this.mText = message;  
  92.         this.mTextView.setText(this.mText);  
  93.     }  
  94.   
  95.     public void setMessage(final int resId) {  
  96.         this.mText = this.mContext.getResources().getText(resId);  
  97.         this.mTextView.setText(this.mText);  
  98.     }  
  99.     //设置监听器 也就是实例化接口  
  100.     public void setOnClickListener(final OnOKClickListener clickListener) {  
  101.         this.mClickListener = clickListener;  
  102.     }  
  103.   
  104.     @Override  
  105.     public void setTitle(final CharSequence title) {  
  106.         this.mTitle = title;  
  107.         this.mTitleView.setText(this.mTitle);  
  108.     }  
  109.   
  110.     @Override  
  111.     public void setTitle(final int resId) {  
  112.         this.mTitle = this.mContext.getResources().getText(resId);  
  113.         this.mTitleView.setText(this.mTitle);  
  114.     }  
  115.   
  116. }  
    方式和上面介绍的一样,感兴趣的朋友可以自己去实现其他效果的。

猜你喜欢

转载自blog.csdn.net/ZLAKS123456/article/details/51821746