我受到Android奇怪事件处理的影响。我的问题是,如果用户在Button
上点击多次,那么事件将被排队并进一步转移到下一个Activity
。
下面是一个例子:
<Button
android:id="@+id/btn_home_show"
style="@style/main_buttons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/home_label_show" />
Activity
onClick
:
public void onClick(View view) {
int viewId = view.getId();
if (viewId == EXPECTED_VIEW_ID) {
Intent intent = new Intent(this, CarouselActivity.class);
startActivity(intent);
}
}
在我的Activity
中,我有另一个项目,可以在屏幕上点击相同的坐标。
如果用户在Button
上快速点击,那么这个点击事件将被转移到新启动的Activity
上,并发生另一个onClick
处理。
我试过2.3.3 &2.3.5框架版本&行为是一样的。什么好主意吗?
一个简单的解决方案是添加一个布尔值来决定是否处理点击,然后创建一个休眠的线程,然后将该值设置为true
public void onClick(View view) {
if (inputAllowed) {
//do stuff
}
}
boolean inputAllowed = true;
private class ButtonDelay extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
try {
inputAllowed = false;
Thread.sleep(500);
inputAllowed = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(final Void unused) {
}
}
并立即在onCreate()中启动asynctask。至于为什么会发生这种情况,我猜新的活动已经创建了新的按钮,因为用户是快速点击它注册这些点击。
您的问题不在于点击事件被转移到新的活动。问题是,在第一次点击后,你正在做你的新活动将开始出现。如果用户再次点击一些时间,你的新活动加载并接收点击,因为它应该做的。我假设你在活动变化期间阻塞了ui线程,因为用户不确定他是否已经点击了按钮并试图再次点击它。
试着固定你的活动切换。你可以用一个捕捉所有点击事件的Spinner来显示Overlay,直到你准备好显示Activity的正确UI。这样,用户就会意识到发生了什么事情,并停止点击,等待旋转器消失。