android - 如何将音量键事件传递给DialogFragment

标签 android android-fragments volume android-dialogfragment onkeydown

我花了几个小时来实现这个简单的用例:当我按下音量硬件按钮时,我想打开一个 DialogFragment。该对话框包含一个 SeekBar,它应根据按下的按钮进行设置。

我这里有几个问题。

首先,我不知道如何将 KeyEvents 传递给 fragment 。我创建了一个 BroadcastReceiver 并通过 AudioManager.registerMediaButtonEventReceiver 注册它。此外,我将接收器放入 AndroidManifest.xml 中:

    <receiver android:name=".fragment.ActionbarFragment$MediaButtonEventReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON"/>
        </intent-filter>
    </receiver>

但是这个接收器只有在我使用以下 Intent 过滤器时才起作用:

        <intent-filter>
            <action android:name="android.media.VOLUME_CHANGED_ACTION"/>
        </intent-filter>

当我查看 AudioManager.VOLUME_CHANGED_ACTION 时,您会发现以下评论:

 * @hide Broadcast intent when the volume for a particular stream type changes.
 * Includes the stream, the new volume and previous volumes.
 * Notes:
 *  - for internal platform use only, do not make public,
 *  - never used for "remote" volume changes

所以,有一天它可能会停止,我想避免这种 Intent 。还有什么选择呢?如何将按键事件从硬件按钮正确传递到 fragment ?

第二,当 DialogFragment 打开时,尽管我已经覆盖了 onKeyDown,但仍显示默认的 Android VolumePanel:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return true;
}

据我所知, fragment 没有自己的 onKeyDown,所以我想知道为什么当我按下硬件按钮时会显示 VolumePanel。

最佳答案

我终于解决了这两个问题。首先,MEDIA_BUTTON 似乎响应音量变化。它显然只响应 PLAYPAUSESTOP 等,这不是我想要的。

最简单的解决方案仍然是在每个ActivityOnKeyDown()中处理按键事件:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
       keyCode == KeyEvent.KEYCODE_VOLUME_UP ||
       keyCode == KeyEvent.KEYCODE_MENU) {
        showSoundSettingsDialog();
    }

    return true;
}

为了编写一次代码,我将这部分移动到 Activity 继承的 BaseActivity 中。

第二个问题是通过向对话框添加一个简单的 OnKeyListener 来解决的,因为它们有自己的 KeyEvents,这是我到目前为止还不知道的。

    builder.setOnKeyListener(new Dialog.OnKeyListener() {

        @Override
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
                volumeUp();
            } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                volumeDown();
            } else if (keyCode == KeyEvent.KEYCODE_BACK) {
                dialog.dismiss();
            }

            return true;
        }
    });

就是这样。

关于android - 如何将音量键事件传递给DialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22919530/

相关文章:

java - 没有设备的 Android 应用程序开发

android - 在android设备中接收UDP广播时丢包

docker - 无法将 secret 卷安装到kubernetes

php - FFMPEG 检测流媒体量 (PHP)

android - OptionsMenu 在 Android 4.1 上只打开一次

android - 多个手机警报,一个覆盖另一个。哪个警报先于?怎么运行的?

android - android中的经度和纬度为空

java - 如何保存最后一个 fragment ?

android - 列出 fragment 中的 Activity

ios - 切换音量时 UIView 覆盖是否有不同的 api?