Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将卷键事件传递给DialogFragment_Android_Android Fragments_Volume_Android Dialogfragment_Onkeydown - Fatal编程技术网

Android 如何将卷键事件传递给DialogFragment

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=

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

我这里有几个问题

首先,我不知道如何将KeyEvents传递给片段。我创建了一个BroadcastReceiver,并通过
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;
        }
    });