Java设计模式之Command在Android中的应用

1.概念:其实刚开始我也不是很理解这一模式。后面看到一些文章谈到Command模式的许多代码都是针对图形界面,它实际就是菜单命令。把这句话照搬到Android中,会发现我们经常做的一些如对点击事件的监听就是采用的这种模式:把对控件和对控件的事件处理分离开来,降低耦合性。它和适配器模式非常相似,只不过适配器是针对内容,而command是针对事件。

2.应用:android 中的点击监听事件就是command模式,对此我们也可以模仿源码来实现一个command模式。以系统Button的点击事件为原型,模仿自定义一个MyButton的设置点击监听事件。
a. 先看Button中的源码:

 public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

public void setOnClickListener(OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }
   public boolean performClick() {
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

        ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            return true;
        }

        return false;
    }

b.模仿button:

// 1.自定义一个接口:
public interface onMyButtonClickListener {
        // 抽象的业务方法:
        public void mybusiness();
    }

// 2.添加监听器
private onMyButtonClickListener listener;
public void setOnMyButtonClickListener(onMyButtonClickListener listener) {
        this.listener = listener;
    }


@Override
    public boolean performClick() {
        // 点击button 按钮的时候,就会调用该方法:
        // 在此方法中,可以实现业务类:用接口实现,具体业务类分离出来
        // 3.内部调用监听器:==》一定要调用
        if (listener != null) {
            listener.mybusiness();
        }
        return super.performClick();
    }

经过以上代码:MyButton就定义好了,现在在activity中调用该方法,看看能否响应点击事件:

public class MainActivity extends Activity {

    private MyButton mButton;

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

        mButton = (MyButton) findViewById(R.id.mybutton);
        mButton.setOnMyButtonClickListener(new onMyButtonClickListener() {
            @Override
            public void mybusiness() {
                Toast toast = Toast.makeText(getApplicationContext(), "响应点击事件", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
            }
        });
    }       
}   

看测试结果,说明OK.
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值