gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:58:33 24 4
gpt4 key购买 nike

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

我这里有几个问题。

首先,我不知道如何将 KeyEvents 传递给 fragment 。我创建了一个 BroadcastReceiver 并通过 AudioManager.registerMediaButtonEventReceiver 注册了它。此外,我将 Receiver 放在 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 打开时,会显示默认的 Android VolumePanel,尽管我已经覆盖了 onKeyDown:

@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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com