基于接口和基于事件的回调(1)-Android

> 基于事件的回调
方法一:写一个内部类,在类中实现点击事件
 1、在父类中调用点击事件
bt_dail.setOnClickListener(new MyButtonListener());  
 2、创建内部类
private class MyButtonListener implements OnClickListener{  
        /** 
         * 当按钮被点击的时候调用 
         */  
        @Override  
        public void onClick(View v) {  
          
            callPhone();  
        }  
          
    }  

方法二:使用匿名内部类
 bt_dail.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                callPhone();  
            }  
        })  

方法三:让activity实现点击接口
1、实现点击接口
  public class MainActivity extends Activity implements OnClickListener
2、调用点击事件方法
  bt_dail.setOnClickListener(this);  
3、实现接口方法
@Override  
public void onClick(View v) {  
    switch (v.getId()) {  
    case R.id.bt_dail:  
        callPhone();  
        break;  
  
    default:  
        break;  
    }  
      
}  

方法四、在layout  XML文件中定义button点击时所调用的方法 
1、指定方法
<Button
        android:id="@+id/bt_dail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="dailPhone"
        android:text="拨打此号码" />
2、定义方法
public void dailPhone(View view){  
    callPhone();  
}  
  对于Android 基于监听的事件处理而言, 主要做法就是为Android 界面组件拥定特定的事件监昕器, 上一章我们己经见到大量这种事件处理的示例
  对于Android 基于回调的事件处理而吉, 主要做法就是重写Android 组件特定的回调方法,或者重写Activity的回调方法. Android 为绝大部分界面组件都提供了事件响应的回调方法,开发者只要重写它们即可.
  一般来说,基于回调的事件处理可用于处理一些具有通用性的事件,基于回调的事件处理代码显得比较简洁.但由于某些特定的事件, 无法使用基于回调的事件处理,只能使用基于监听的事件处理.

> 基于接口的回调
xUtils框架及一些框架都使用到了接口回调。
  在Android中到处可见接口回调机制,尤其是UI事件处理方面。举一个最常见的例子button点击事件,button有一个点击方法onClick(),我们知道onclick()是一个回调方法,当用户点击button就执行这个方法。在Android中接口回调机制的源码中是这样定义的:
//这个是View的一个回调接口  
/**  
* Interface definition for a callback to be invoked when a view is clicked.  
*/  
public interface OnClickListener {  
    /**  
     * Called when a view has been clicked.  
     *  
     * @param v The view that was clicked.  
     */  
    void onClick(View v);  

public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {  
     /**  
     * Listener used to dispatch click events.  
     * This field should be made private, so it is hidden from the SDK.  
     * {@hide}  
     */  
    protected OnClickListener mOnClickListener;  
     
    /**  
     *  
     * Register a callback to be invoked when this view is clicked. If this view is not  
     * clickable, it becomes clickable.  
     *  
     * @param l The callback that will run  
     *  
     * @see #setClickable(boolean)  
     */  
     
    public void setOnClickListener(OnClickListener l) {  
        if (!isClickable()) {  
            setClickable(true);  
        }  
        mOnClickListener = l;  
    }  
       
    /**  
     * Call this view's OnClickListener, if it is defined.  
     *  
     * @return True there was an assigned OnClickListener that was called, false  
     *         otherwise is returned.  
     */  
    public boolean performClick() {  
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);  
  
        if (mOnClickListener != null) {  
            playSoundEffect(SoundEffectConstants.CLICK);  
             
            mOnClickListener.onClick(this);  
            return true;  
        }  
  
        return false;  
    }  
}   

-- AlertInfoDialog一种实现,利于重复使用。那我们就可以对此进行一个封装,看代码:
public class AlertInfoDialog extends Dialog implements View.OnClickListener {  
    //创建接口  
    public static interface OnOKClickListener {  
        public void onOKClick();  
    }  
  
    private final Context mContext;  
    private TextView mTitleView;  
    private TextView mTextView;  
  
    private Button mButtonOk;  
    private CharSequence mTitle;  
  
    private CharSequence mText;  
    //生命接口对象  
    private OnOKClickListener mClickListener;  
  
    public AlertInfoDialog(final Context context, final String title,  
            final String text) {  
        super(context, R.style.Dialog);  
        this.mContext = context;  
        this.mTitle = title;  
        this.mText = text;  
    }  
  
    private void init() {  
        setContentView(R.layout.dialog_alert);  
  
        this.mTitleView = (TextView) findViewById(R.id.title);  
        final TextPaint tp = this.mTitleView.getPaint();  
        tp.setFakeBoldText(true);  
        this.mTitleView.setText(this.mTitle);  
  
        this.mTextView = (TextView) findViewById(R.id.text);  
        this.mTextView.setText(this.mText);  
  
        this.mButtonOk = (Button) findViewById(R.id.button_ok);  
        this.mButtonOk.setOnClickListener(this);  
  
    }  
  
    @Override  
    public void onClick(final View v) {  
        final int id = v.getId();  
        switch (id) {  
        case R.id.button_ok:  
            cancel();//调用  
            if (this.mClickListener != null) {  
                this.mClickListener.onOKClick();  
            }  
            break;  
        default:  
            break;  
        }  
    }  
  
    @Override  
    protected void onCreate(final Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setBlurEffect();  
        init();  
    }  
  
    protected void setBlurEffect() {  
        final Window window = getWindow();  
        final WindowManager.LayoutParams lp = window.getAttributes();  
        // lp.alpha=0.8f;  
        lp.dimAmount = 0.6f;  
        window.setAttributes(lp);  
        window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);  
        // window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);  
    }  
  
    public void setMessage(final CharSequence message) {  
        this.mText = message;  
        this.mTextView.setText(this.mText);  
    }  
  
    public void setMessage(final int resId) {  
        this.mText = this.mContext.getResources().getText(resId);  
        this.mTextView.setText(this.mText);  
    }  
    //设置监听器 也就是实例化接口  
    public void setOnClickListener(final OnOKClickListener clickListener) {  
        this.mClickListener = clickListener;  
    }  
  
    @Override  
    public void setTitle(final CharSequence title) {  
        this.mTitle = title;  
        this.mTitleView.setText(this.mTitle);  
    }  
  
    @Override  
    public void setTitle(final int resId) {  
        this.mTitle = this.mContext.getResources().getText(resId);  
        this.mTitleView.setText(this.mTitle);  
    }  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值