我有以下代码在检测到onTap事件后启动一个活动。
麻烦的是,通常情况下,只需按一下即可检测到来自一个用户的2-3次点击,因此启动多次。有没有办法抑制效果,只打开一次?
protected boolean onTap(int i) {
Log.i("TAP","CALLED");
myOverlayItem item =getItem(i);
if (selectedName.equals(item.getTitle())){
try{
Intent myIntent = new Intent(AppMain.this, DetailActivity.class);
myIntent.putExtra( "int", i);
myIntent.putExtra( "string", selectedName );
AppMain.this.startActivity(myIntent);
}catch (Exception e){
Log.e("Error", "Cannot launch", e);
}
}
}
谢谢!
答案 0 :(得分:1)
尝试将布尔值设置为true,这样您就可以确保代码只运行一次
boolean activityIsAlreadyRunning;
if(activityIsAlreadyRunning == false){
if (selectedName.equals(item.getTitle())){
try{
Intent myIntent = new Intent(AppMain.this, DetailActivity.class);
myIntent.putExtra( "int", i);
myIntent.putExtra( "string", selectedName );
AppMain.this.startActivity(myIntent);
activityIsAlreadyRunning = true;
}catch (Exception e){
Log.e("Error", "Cannot launch", e);
}
}
}
答案 1 :(得分:1)
您也可以尝试阅读android:launchMode。这是通过单个或多个实例启动您的活动的方式。
答案 2 :(得分:0)
为什么不能发出onClickListener
?这将在点击时启动一次。另一种可能的解决方案也可能是简单地在父类中设置一个公共布尔变量,当你的函数启动时,只需设置isRunning = true;
,然后在它完成之前就可以设置isRunning = false;
。这将允许您在块中包含事件的启动:
if (!isRunning){
onTap(integer);
}
这样可以使方法不是在触摸上运行,除非它当前没有运行。如果这没有帮助,您可以随时比较您的触摸事件event.x
& event.y
与event.getEventTime()
不同。然后它会在onTouchEvent
:
if ((Math.abs(event.x - mLastEventX) > 2.0f) ||
(Math.abs(event.y - mLastEventY) > 2.0f) ||
((event.getEventTime() - mLastEventTime) > 500f)){
onTap(integer);
}
这基本上会使它不会启动,除非以下任何一个是真的:
((Math.abs(event.x - mLastEventX) > 2.0f)
或X值变化超过2 (Math.abs(event.y - mLastEventY) > 2.0f)
或Y值变化超过2 ((event.getEventTime() - mLastEventTime) > 500f)
或时间增加了500毫升如果没有更多关于您究竟要完成什么的信息,我很难为您提供适合您的解决方案。如果这些都不起作用,请尝试putExtras / getExtras
处理使用意图放置并在整个活动开始和结束时获取信息。