【问题标题】: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 android-activity callback android-actionbar


【解决方案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
               }
           }
       }
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多