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
回调完成后 - 或者甚至更晚。
另一个例子是
我真的不想在每次出现时手动引入布尔标记。 我想到了一个类似注释的东西,允许我指定一个重置自动生成的布尔值的事件。除了样板代码之外的任何东西。
那么这里最好的做法是什么(特别是要记住黄油刀的用法)?
答案 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()
}
快乐的科特林;)