卷首选项 - 阻止卷键

时间:2011-10-07 07:04:54

标签: android

我已经看到了几个与解决方案类似的问题,但我找不到一个适用于我的情况。

我正在制作VolumePreference(扩展DialogPreference),让用户为某些警报选择音量级别。

在其他偏好中,用户选择在闹铃期间播放的所需铃声。当用户在VolumePreference中选择音量时也会播放它,因此他知道它实际上是如何发声的。

在另一个偏好中,用户选择在播放时警报是否应“覆盖”手机的媒体音量级别 - 我这样做,因此如果用户想要具有固定音量级别以进行警报,那么它不应受到音量变化的影响钥匙等。 如果用户选择这样做,在开始在AlarmActivity中播放闹钟之前,我使用AudioManager将音量设置为最大音量,并拦截音量键的所有keyDown事件,并在闹钟结束后恢复音量。

问题是,我无法阻止我的VolumePreference中的音量键,因为没有onKeyDown方法。

经过一些检查,我发现AudioManager的registerMediaButtonEventReceiver方法“注册一个组件成为MEDIA_BUTTON意图的唯一接收者。”,我认为这可能有助于我的情况(制作一些空的接收器),甚至使音量锁定更多通用(当我想开始锁定时注册,解锁后取消注册),但是它正在从API8开始工作,而我正在为API7制作应用程序 - 它仍然占据了我读过的市场10%以上,所以我想坚持它

关于如何在PreferenceDialog中阻止音量变化的任何想法?

1 个答案:

答案 0 :(得分:0)

经过一些思考解决方案证明非常简单 - 可以覆盖在DialogPreference的onCreateDialogView中创建的onKeyDown方法或设置该视图的onKeyListener。

第一个例子:

LinearLayout layout = new LinearLayout(mContext)
    {
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
                    || keyCode == KeyEvent.KEYCODE_VOLUME_UP) return true;
            return super.onKeyDown(keyCode, event);
        }

        @Override
        public boolean onKeyUp(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
                    || keyCode == KeyEvent.KEYCODE_VOLUME_UP) return true;
            return super.onKeyUp(keyCode, event);
        }
    };

第二个例子(mDialogView保存了对第一个例子的布局的引用):

mDialogView.setOnKeyListener(new View.OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
                        || keyCode == KeyEvent.KEYCODE_VOLUME_UP)
                    return true;
                return false;
            }
        });

我选择了第二种解决方案,因为我觉得它更灵活,至少有两个原因

  • 我可以删除侦听器以停止阻止音量键,而在第一种方法中我不能
  • 在第一个解决方案中,我需要决定是否要在创建View时阻止键输入 - 如果VolumePreference正在扩展其他不应阻止键输入的其他Preference,则用处不多