【问题标题】:How to check if toggle buttons are on and do an action if they are but not all at the same time?如何检查切换按钮是否打开并在它们打开但不是同时执行操作?
【发布时间】:2020-03-24 20:43:27
【问题描述】:

我正在尝试创建一个非常基本的应用程序,当我按下播放按钮时,它会为每个切换按钮播放声音,但我不希望它们同时播放声音。我希望以 1 秒的间隔播放所有声音。到目前为止我创建的播放方法似乎不起作用,因为我总是只听到 1 个声音。这是我的玩法:

    public void play() {
        final Handler hand = new Handler();
        hand.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (button1.isChecked()) {
                    sp.play(snareId, 10, 10, 1, 0, 1);
                }
            }
        }, 0);
        hand.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (button2.isChecked()) {
                        sp.play(snareId, 10, 10, 1, 0, 1);
                    }
                }
                }, 1000);
        hand.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (button3.isChecked()) {
                        sp.play(snareId, 10, 10, 1, 0, 1);
                    }
                }
                }, 2000);
        hand.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (button4.isChecked()) {
                        sp.play(snareId, 10, 10, 1, 0, 1);
                    }
                }
                }, 3000);
        }

我真的不明白为什么这不能正常工作。另外,还有其他更简单的方法可以实现相同的目标吗?

【问题讨论】:

    标签: android togglebutton


    【解决方案1】:

    问题是,处理程序的每个实例仅与单个线程相关联。 您不能将这样的一个处理程序用于最多 4 个不同的 Runnables。 本质上,您总是覆盖前一组 Runnable,因此只能听到最后一组 Runnable 的声音。

    编辑(再次):

    我目前没有在这台设备上安装任何 Java IDE 甚至 Android Studio,所以下面的代码只是一个想法,没有经过测试,但我想它可能会工作。

    public void play() {
    
        List<int> soundIDs = new List<int>();
    
        if (button1.isChecked()) {
            soundIDs.add(snareID);      //you probably might want to set these IDs different, but I assume snareID for example stands for one of the IDs of one of your sound files
        }
        if (button2.isChecked()) {
            soundIDs.add(snareID);
        }
        if (button3.isChecked()) {
            soundIDs.add(snareID);
        }
        if (button4.isChecked()) {
            soundIDs.add(snareID);
        }
    
    
        final Handler hand = new Handler();
        hand.postDelayed(new Runnable() {
            @Override
            public void run() {
                if(soundIDs.size() > 0) {
                    sp.play(soundIDs.get(0), 10, 10, 1, 0, 1);
                    soundIDs.remove(0);
                    handler.postDelayed(this, 1000);
                }
            }
        }, 1000);
    }
    

    正如我所说,我没有测试过它,其他人可能有更好的解决方案,但我希望它可以工作。 声音之间的时间差是(如在您的代码中)每次声音开始之间的 1000。但请记住,这并不一定意味着您在一个声音结束和下一个声音开始之间有 1000 的延迟。

    【讨论】:

    • 那么我该如何解决这个问题呢?还有其他方法可以实现我的目标吗?它可以与计时器一起使用吗?
    • 目前在您的源代码中,您总是使用“snareID”作为参数。我不知道这是否真的是你的意图。但除此之外,我在我的答案中添加了一个源代码的想法。
    • 是的,我的想法是,对于每个切换的切换按钮,我只想听到 1 个声音(一种小军鼓声音)。我会尝试你的源代码想法,并会反馈感谢您的帮助!
    • 所以我试了一下,但似乎这一行的方法 next() :“sp.play(soundIDs.next(), 10, 10, 1, 0, 1);"无法解决。我不知道为什么。
    • 是的,代码现在是可编译的,但不幸的是它仍然无法工作......我真的不明白出了什么问题,现在我要么有时只听到两次声音,要么按下播放键什么都听不见。这是超级随机和不一致的。我不认为创建一个像为每个选中的切换按钮播放声音这样简单的应用程序会如此困难。我什至尝试通过制作一组按钮并在“for”条件下检查每个按钮来做到这一点,但它仍然是一样的。无论如何,谢谢你的时间。
    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多