避免双击操作栏中的项目

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
         
     
 

【讨论】:

以上是关于避免双击操作栏中的项目的主要内容,如果未能解决你的问题,请参考以下文章

鼠标双击怎么办,如何避免双击

Magnolia defaultAction 与从操作栏中单击实际操作在获取 JCR 项目方面的区别

将视图控制器中的项目约束到导航栏中的项目

去除vue项目地址栏中的#

导航栏中的 Barbutton 项目左栏按钮粘在左上角

jQuery Mobile 导航栏中每行超过 5 个项目