我受到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&amp; 2.3.5框架版本&amp;行为是一样的。有什么想法吗?
答案 0 :(得分:1)
一个简单的解决方案是添加一个布尔值来确定是否处理了一个点击然后创建一个休眠的线程然后将值设置为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。至于为什么会发生这种情况,我猜新活动已经创建了新按钮,并且由于用户正在快速点击它,所以注册这些点击。
答案 1 :(得分:1)
问题不在于点击事件是否已转移到新活动。问题是,在您第一次点击后,您的新活动将开始出现。如果用户再次单击您的新活动会加载并接收按预期执行的操作。我假设您在活动更改期间阻止了UI-Thread,因此用户不确定他是否按下按钮并尝试再次单击它。
尝试加快您的活动切换。您可以使用Spinner显示Overlay,捕获所有点击事件,直到您准备好显示活动的正确UI。通过这种方式,用户意识到发生了某些事情,并将停止点击并等待微调器消失。