Android 如何将卷键事件传递给DialogFragment
我花了几个小时让这个简单的用例工作:当我按下音量硬件按钮时,我想打开一个DialogFragment。该对话框包含一个SeekBar,应根据按下的按钮进行设置 我这里有几个问题 首先,我不知道如何将KeyEvents传递给片段。我创建了一个BroadcastReceiver,并通过Android 如何将卷键事件传递给DialogFragment,android,android-fragments,volume,android-dialogfragment,onkeydown,Android,Android Fragments,Volume,Android Dialogfragment,Onkeydown,我花了几个小时让这个简单的用例工作:当我按下音量硬件按钮时,我想打开一个DialogFragment。该对话框包含一个SeekBar,应根据按下的按钮进行设置 我这里有几个问题 首先,我不知道如何将KeyEvents传递给片段。我创建了一个BroadcastReceiver,并通过AudioManager.RegisterDiaButtoneVentReceiver注册了它。此外,我将接收器放入AndroidManifest.xml: <receiver android:name=
AudioManager.RegisterDiaButtoneVentReceiver
注册了它。此外,我将接收器放入AndroidManifest.xml
:
<receiver android:name=".fragment.ActionbarFragment$MediaButtonEventReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
所以,有一天它可能会刹车,我想避免这种意图。替代方案是什么?如何将关键事件从硬件按钮正确传递到片段
Second,当DialogFragment打开时,会显示默认的Android VolumePanel,尽管我已经覆盖了onKeyDown
:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return true;
}
据我所知,片段没有自己的onKeyDown,所以我想知道,当我按下硬件按钮时,为什么会显示VolumePanel。我最终解决了这两个问题。首先,
MEDIA\u按钮
似乎不响应音量变化。它显然只对播放
、暂停
、停止
等做出响应,这不是我想要的
最简单的解决方案仍然是处理每个活动的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;
}
为了编写一次代码,我将此部分移动到一个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;
}
});
就这样
@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;
}
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;
}
});