我花了几个小时来实现这个简单的用例:当我按下音量硬件按钮时,我想打开一个 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
似乎不响应音量变化。它显然只响应 PLAY
、PAUSE
、STOP
等,这不是我想要的。
最简单的解决方案仍然是在每个Activity
的OnKeyDown()
中处理按键事件:
@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/