按钮点击多次触发

时间:2016-07-21 11:34:43

标签: android butterknife

Android应用程序中的常见问题似乎是,点击事件可以多次触发,而不应该触发。

我正在使用Butterknife - 请考虑以下示例

@OnClick(R.id.button_foto_aufnehmen)
protected void takePicture() {
  m_camera.takePicture();
}

使用包含

的布局的相机应用
    <SurfaceView
        android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    ...

    <ImageButton
        android:id="@+id/button_foto_aufnehmen"
        .../>

现在不应该再次点击该按钮,直到onPictureTaken回调完成后 - 或者甚至更晚。

另一个例子是

我真的不想在每次出现时手动引入布尔标记。 我想到了一个类似注释的东西,允许我指定一个重置自动生成的布尔值的事件。除了样板代码之外的任何东西。

那么这里最好的做法是什么(特别是要记住黄油刀的用法)?

2 个答案:

答案 0 :(得分:1)

我之前遇到过这种情况。基本上我最终实现了自己的CustomClickListener并在允许触发触发器之前设置了特定时间间隔的阈值(例如,1000ms)。 基本上,当您单击按钮并触发侦听器时,它将检查触发器是否在您定义的过去时间内执行,如果不是,则会触发它。

public class CustomClickListener implements View.OnClickListener {

    protected int defaultInterval;
    private long lastTimeClicked = 0;

    public CustomClickListener() {
        this(1000);
    }

    public CustomClickListener(int minInterval) {
        this.defaultInterval = minInterval;
    }

    @Override
    public void onClick(View v) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return;
        }
        lastTimeClicked = SystemClock.elapsedRealtime();
        performClick(v);
    }

     public abstract void performClick(View v);

}

在您的课堂上,您可以执行以下操作而不会危及您的实施(普通代码)

myButton = (Button) findViewById(R.id.my_button);
myButton.setOnClickListener(new CustomClickListener() {
    @Override
    public void performClick(View view) {
        // do stuff
    }
});

或者使用ButterKnife实现(我还没有测试过,因为我现在还没有掌握Android Studio,所以如果有效,请告诉我):

@Bind(R.id.my_button)
Button myButton;

@OnClick(R.id.button)
@Override
public void performClick(View view) {
     // do stuff
}

此致

答案 1 :(得分:1)

以上解决方案非常好。 但是如果使用Kotlin的功能,它将变得更好

1)创建SafeClikc侦听器

class SafeClickListener(
        private var defaultInterval: Int = 1000,
        private val onSafeCLick: (View) -> Unit
) : View.OnClickListener {

    private var lastTimeClicked: Long = 0

    override fun onClick(v: View) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return
        }
        lastTimeClicked = SystemClock.elapsedRealtime()
        onSafeCLick(v)
    }
}

2)添加扩展功能以使其可用于任何视图,这将创建一个新的SafeClickListener并将工作委托给它

fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {

    val safeClickListener = SafeClickListener {
        onSafeClick(it)
    }
    setOnClickListener(safeClickListener)
}

3)现在非常容易使用

settingsButton.setSafeOnClickListener {
    showSettingsScreen()
}

快乐的科特林;)