避免双击操作栏中的项目
Posted
技术标签:
【中文标题】避免双击操作栏中的项目【英文标题】:Avoid an item from Action Bar from being double clicked 【发布时间】:2017-02-05 04:58:46 【问题描述】:我为我的 android 应用设计了一个操作栏。在此操作栏中,有一个按钮可启动用于配置我的应用程序行为的 Dialog Activity。如果我双击这个按钮的速度足够快,我可以命令 Dialog Activity 在它实际出现之前启动两次,然后它看起来是重复的并且在视觉上是重叠的,我不想要这个。我试图创建某种锁定机制,但它不起作用,因为我的 Dialog Activity 仅在我的 Main Activity 调用方法 (onOptionsItemSelected) 中的所有代码都执行后才启动。有没有办法避免这种形式发生?
我的代码是:
@Override
public boolean onOptionsItemSelected(MenuItem item)
//ensure only one element from the option menu is launched at once (if you double click fast you could launch two)
Log.e("test", "onOptionsItemSelected ");
if(optionItemAlreadySelected == false)
optionItemAlreadySelected = true;
int id = item.getItemId();
if (id == R.id.action_sound_mode)
//item.setVisible(false);
Intent intent = new Intent(this, SoundConfigurationActivity.class);
startActivity(intent);
optionItemAlreadySelected = false; //this code is executed before the activity is started!!!
return true;
return super.onOptionsItemSelected(item);
有没有办法知道 Dialog Activity 何时已经关闭,并在此之前锁定再次打开它的机会。
【问题讨论】:
Android Preventing Double Click On A Button的可能重复 【参考方案1】:您可以使用布尔变量来跟踪Dialog
的状态。当您单击按钮时,您设置mDialogShown = true
以阻止任何其他显示对话框请求。
现在,当用户按下后退按钮并关闭对话框时,会调用 onActivityResult。
此时您确定对话框已关闭。
我假设您的代码在 Activity 中:
class MainActivity extend Activity
static final int SHOW_DIALOG_REQUEST = 1; // The request code
static boolean mDialogShown = false; // True if dialog is currently shown
@Override
public boolean onOptionsItemSelected(MenuItem item)
int id = item.getItemId();
if (id == R.id.action_sound_mode)
showDialog();
return true;
return super.onOptionsItemSelected(item);
private void showDialog()
if (!mDialogShown)
mDialogShown = true;
Intent intent = new Intent(this, SoundConfigurationActivity.class);
startActivityForResult(intent, SHOW_DIALOG_REQUEST);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
// Check which request we're responding to
if (requestCode == SHOW_DIALOG_REQUEST)
mDialogShown = false;
文档https://developer.android.com/training/basics/intents/result.html https://developer.android.com/guide/topics/ui/dialogs.html#ActivityAsDialog
【讨论】:
【参考方案2】:科特林
这是一个基于屏幕(活动、片段)的解决方案,可避免双击菜单操作。
将以下全局变量添加到包含 onOptionsItemSelected 函数的活动/片段中。
private var previousClickTimeMillis = 0L
在项目的任何地方写下面的函数,即Utils。
fun singleSafeClick(
previousClickTimeMillis: Long,
block: (previousClickTimeMillis: Long) -> Unit)
val currentTimeMillis = System.currentTimeMillis()
if (currentTimeMillis < previousClickTimeMillis || currentTimeMillis >= previousClickTimeMillis + OnSingleClickListener.DELAY_MILLIS)
block(currentTimeMillis)
如下编写触发代码。
override fun onOptionsItemSelected(item: MenuItem): Boolean
when (item.itemId)
R.id.action_delete ->
singleSafeClick(previousClickTimeMillis) tappedTime ->
previousClickTimeMillis = tappedTime
// Write Yyur code here
【讨论】:
以上是关于避免双击操作栏中的项目的主要内容,如果未能解决你的问题,请参考以下文章