按钮触发应该只调用一次的操作。在执行操作之前,该按钮在onClick处理程序中被禁用和隐藏:
someButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someButton.setEnabled(false);
someButton.setClickable(false);
someButton.setVisibility(View.GONE);
performTaskOnce();
}
});
private void performTaskOnce() {
Log.i("myapp", "Performing task");
//Do something nontrivial that takes a few ms (like changing the view hierarchy)
}
即使该按钮立即被禁用,也可以通过非常快速地多次轻敲来触发多个"onClick“事件。(即performTaskOnce
被多次调用)。在按钮实际被禁用之前,onClick事件似乎已排队。
我可以通过检查每个单独的onClick句柄来解决这个问题,检查相应的按钮是否已经被禁用,但这似乎是一个技巧。有没有更好的方法来避免这个问题?
这个问题发生在Android 2.3.6上,我不能在Android 4.0.3上重现它。但考虑到4.x设备的稀缺性,不能选择排除较旧的设备。
发布于 2012-06-01 20:43:04
您可以在单击按钮时将布尔变量设置为true,并在处理完单击时将其设置为false。
通过这种方式,您可以忽略多次单击,并且不必禁用按钮,可能会避免恼人的按钮闪烁。
boolean processClick=true;
someButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(processClick)
{
someButton.setEnabled(false);
someButton.setClickable(false);
someButton.setVisibility(View.GONE);
performTaskOnce();
}
processClick=false;
}
});
private void performTaskOnce() {
Log.i("myapp", "Performing task");
//Do something nontrivial that takes a few ms (like changing the view hierarchy)
}
发布于 2014-03-14 02:46:21
为了保持DRY
// Implementation
public abstract class OneShotClickListener implements View.OnClickListener {
private boolean hasClicked;
@Override public final void onClick(View v) {
if (!hasClicked) {
onClicked(v);
hasClicked = true;
}
}
public abstract void onClicked(View v);
}
// Usage example
public class MyActivity extends Activity {
private View myView;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView.setOnClickListener(new OneShotClickListener() {
@Override public void onClicked(View v) {
// do clicky stuff
}
});
}
}
发布于 2014-03-24 15:19:22
有点晚了,但这可能对某些人有用。在我的例子中,我称之为另一个活动,所以;
声明一个布尔值;
boolean clickable;
在listener中单击;
if(clickable){
// Launch other activity
clickable = false;
}
调用onResume时启用;
@Override
public void onResume() {
Log.e(TAG, "onResume");
super.onResume();
clickable = true;
}
https://stackoverflow.com/questions/10848157
复制相似问题