android 避免双击操作栏中的项目

ff29svar  于 2023-08-01  发布在  Android
关注(0)|答案(3)|浏览(95)

我为我的Android应用程序设计了一个操作栏。在此操作栏中有一个按钮,用于启动用于配置应用行为的对话框活动。如果我双击这个按钮的速度足够快,我可以命令对话框活动在它实际出现之前启动两次,然后它出现重复和视觉重叠,我不希望这样。我尝试创建某种锁定机制,但它不起作用,因为只有在执行了Main Activity调用方法(onOptionsItemSelected)中的所有代码后,才启动Dialog Activity。有没有办法避免这种形式的发生?
我的代码是:

@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);
}

字符串
有没有一种方法可以知道对话框活动何时已经关闭,并锁定再次打开它的机会,直到那时。

iugsix8n

iugsix8n1#

Kotlin

这是一个基于屏幕(活动,片段)的解决方案,以避免双击菜单动作。

  • 将下面的全局变量添加到包含onOptionsItemSelected函数的activity/fragment中。
private var previousClickTimeMillis = 0L

字符串

  • 写在下面的功能在项目中的任何地方,即实用程序。
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
         }
     }
 }
}

gt0wga4j

gt0wga4j2#

您可以使用布尔变量来跟踪Dialog的状态。单击按钮时,您将mDialogShown = true设置为阻止任何其他show dialog请求。
现在,当用户按下“返回”按钮并关闭对话框时,将调用ActivityResult。
此时,您可以确定对话框已关闭。
我假设你的代码在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/guide/topics/ui/dialogs.html#ActivityAsDialog

sr4lhrrt

sr4lhrrt3#

你可以用flag检查,在片段或活动中设置var

private var dialogDisplayed = false

字符串
制造新的乐趣

private fun showDialog() {
 if (!dialogDisplayed) {
        ...set code for opening dialog..
        dialog.show
        dialogDisplayed = true
    } else {
        dialog.dismiss()
        dialogDisplayed = false
        runBlocking {
            showDialog()
        }
    }


}

相关问题