Android 扩展按钮OnClick

Android 扩展按钮OnClick,android,button,onclick,extends,Android,Button,Onclick,Extends,我正在尝试将特定行为添加到按钮的onClick,因此当单击按钮时,它们的自定义行为位于每个按钮的特定操作之上 我最近开始为Android开发,对事件和UI类的内部怪癖几乎没有经验 在我尝试过的情况下,buttom执行我在扩展类中编写的自定义行为,但不执行我指定给按钮的onClick操作 这是我正在尝试的自定义按钮 public class CooldownButton extends Button implements View.OnClickListener { Timer coold

我正在尝试将特定行为添加到
按钮的
onClick
,因此当单击按钮时,它们的自定义行为位于每个按钮的特定操作之上

我最近开始为Android开发,对事件和UI类的内部怪癖几乎没有经验

在我尝试过的情况下,buttom执行我在扩展类中编写的自定义行为,但不执行我指定给按钮的
onClick
操作

这是我正在尝试的自定义
按钮

public class CooldownButton extends Button implements View.OnClickListener
{
    Timer cooldown;

    public CooldownButton(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public CooldownButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CooldownButton(Context context)
    {
        super(context);
    }

    @Override
    public void onClick(View v)
    {
        cooldown= new Timer();
        cooldown.schedule(cooldownRun(),0,500);
        setEnabled(false);
        //performClick();
    }

    private TimerTask cooldownRun()
    {
        return new TimerTask()
        {
            @Override
            public void run()
            {
                cooldown.cancel();
                cooldown.purge();
                setEnabled(true);
            }
        };
    }
}
然后我在
xml
布局上使用它,如下所示:

<CooldownButton android:id="@+id/btnNext"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"                    
                android:onClick="onBtnNextClick" />

从我看到的情况来看,您正在禁用按钮
setEnabled(false)然后您希望在下一次单击时执行一些操作
onBtnNextClick(视图v)
。如果按钮在第一次单击时已被禁用,则不能再次单击该按钮

我根据其中一条评论找到了解决方案。 这并不完全是我想要解决问题的方式,但它已经接近了

我放弃了在java类中创建单击行为的想法。 相反,我在MainActivity中编写了一个单击侦听器,然后将侦听器设置为我想要具有这种特殊单击行为的所有按钮

Button nextButton = (Button) layout.findViewById(R.id.btnNext);
nextButton.setOnClickListener(buttonClickListener);
侦听器如下所示:

public View.OnClickListener buttonClickListener = new View.OnClickListener()     {
    @Override
    public void onClick(View v) {

        final Button btn = (Button) v;
        btn.setEnabled(false);
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {Thread.sleep(1000); }
                catch (InterruptedException e) {e.printStackTrace();}

                MainActivity.this.runOnUiThread(new Runnable()
                {
                    @Override
                    public void run(){ btn.setEnabled(true); }
                });
            }
        }).start();


        switch (v.getId()) {
            case R.id.btnNext:
                    doSomething();
                break;
            //case R.id.foobar:
            //break;
        }
    }
};

我希望在BtnextClick和基类OnClick上运行相同的单击。在本例中,我将添加一个冷却机制,但我希望能够将自定义行为添加到Onclick方法中。请查看有关使自定义视图交互的文档:。我认为您不希望在视图中实现
OnClickListener
。请尝试从xml中删除onClick属性,并从java CoolDownButton类中删除实现,并在java代码中使用它创建CoolDOwnClass的变量,并使用此CoolDownButton.setOnClickListener(new View.OnClickListener(){//将所有逻辑粘贴在此})中;
public View.OnClickListener buttonClickListener = new View.OnClickListener()     {
    @Override
    public void onClick(View v) {

        final Button btn = (Button) v;
        btn.setEnabled(false);
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {Thread.sleep(1000); }
                catch (InterruptedException e) {e.printStackTrace();}

                MainActivity.this.runOnUiThread(new Runnable()
                {
                    @Override
                    public void run(){ btn.setEnabled(true); }
                });
            }
        }).start();


        switch (v.getId()) {
            case R.id.btnNext:
                    doSomething();
                break;
            //case R.id.foobar:
            //break;
        }
    }
};