Java 有人能给我解释一下这个方法是如何工作的吗?
我有一个应用程序,当你按下屏幕上的按钮时,它会播放mp3文件。我想让它,如果我按下后退按钮或主页按钮,而mp3正在播放,歌曲停止播放。我想做一个if语句,检查back/home按钮是否被按下,如果其中任何一个是真的,那么调用myMediaPlayer.stop() 到目前为止,我发现的唯一检查后退按钮是否按下的方法是:Java 有人能给我解释一下这个方法是如何工作的吗?,java,android,keylistener,Java,Android,Keylistener,我有一个应用程序,当你按下屏幕上的按钮时,它会播放mp3文件。我想让它,如果我按下后退按钮或主页按钮,而mp3正在播放,歌曲停止播放。我想做一个if语句,检查back/home按钮是否被按下,如果其中任何一个是真的,那么调用myMediaPlayer.stop() 到目前为止,我发现的唯一检查后退按钮是否按下的方法是: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == Key
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
return true;
}
return super.onKeyDown(keyCode, event);
}
我的问题是,我不知道如何在if语句中调用onKeyDown并检查是否按下了back或home按钮
在哪里可以找到我需要传递给它的键码和事件
**以下是初始化和播放mp3文件的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MediaPlayer mp = new MediaPlayer();
Button b = (Button) findViewById(R.id.default_activity_button);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mp.reset();
AssetFileDescriptor afd;
afd = getAssets().openFd("sound.mp3");
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp.prepare();
mp.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();enter code here
}
}
});
有没有办法做到这一点:
if(mp.isPlaying() == true && /* pseudo code*/BackButtonPressed == true/* pseudo code*/)
{
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (((keyCode == KeyEvent.KEYCODE_BACK)||(keyCode == KeyEvent.KEYCODE_HOME))&&(mp.isPlaying())) {
mp.stop();
}
return super.onKeyDown(keyCode, event);
}
当发生任何按键关闭事件时,操作系统会自动调用此函数。所以,你不需要自己明确地称呼它。您只需检查需要确定的按键。return语句告诉操作系统您是否自己处理了按键。如中所示,当您返回true时,操作系统知道您已成功处理该事件,并且它不需要对特定的按键执行任何操作 但是,检测后退键按下的更标准的方法是重写onBackPressed() 像这样的,
@Override
public void onBackPressed() {
//stop playing mp3
}
在您的情况下,一个更具体的解决方案是,当您的活动进入暂停状态时,按下后退键或主页按钮,立即停止播放音乐
@Override
protected void onPause(){
//stop playing mp3
super.onPause();
}
你说的是UI按钮还是键盘键
onKeyDown
用于捕捉键盘按键
若你们想捕捉按钮点击,你们需要注册一个点击监听器到你们的按钮
如果要捕获密钥,需要在视图中注册一个OnKeyListener
如果要捕捉特殊的后退按钮,则覆盖活动的onBackPressed()
方法就足够了。比如:
public void onBackPressed() {
if (mp.isPlaying()) {
// do want you want
mp.stopPlaying();
} else {
// default behavior ?
super.finish(); // dismiss the current activity
}
}
应该可以工作。
onKeyDown
是安卓系统在按下设备上的按钮时自动调用的一种公共方法。您不需要直接调用它,但需要覆盖它。描述了系统传递给它的KeyEvent
。它包含许多引用特定键的常量。我不在家测试这个,但我想你想要这样的东西:
if(mp.isPlaying() == true && /* pseudo code*/BackButtonPressed == true/* pseudo code*/)
{
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (((keyCode == KeyEvent.KEYCODE_BACK)||(keyCode == KeyEvent.KEYCODE_HOME))&&(mp.isPlaying())) {
mp.stop();
}
return super.onKeyDown(keyCode, event);
}
编辑:我还没有足够的代表直接评论@Swayam的解决方案,但我相信在
onPause
方法中实现您的解决方案也会在方向改变时停止音乐,这可能是不需要的。您不需要这样做。您可以在onPause()
中停止它,我已经将这两个方法都添加到了代码的底部,我应该在哪里调用这些方法?我应该从onCreate方法调用它们吗?当我调用onBackPressed时,活动屏幕关闭,而mp3继续播放。您不需要从任何地方调用它们。操作系统将自动调用这些函数。这些是回调,在活动生命周期中的特定事件发生时调用。您还需要编写代码以停止在onBackPressed中播放mp3。我已从主java文件中添加了代码,以向您确切显示我正在处理的内容。我应该把你说的方法叫到哪里去?我尝试过实现上面的示例,但似乎没有任何效果。我在代码的底部添加了@Swayam的解决方案,我应该在哪里调用这些方法?我应该从onCreate方法调用它们吗?当我按下call On Backpressed时,“活动”屏幕关闭,mp3继续播放。您的代码不应直接调用onKeyDown
或onPause
。当按下onKeyDown
键或您的活动暂停onPause
时,Android系统会为您调用它们。您可能想阅读我在主java文件中添加的Android活动生命周期代码,以向您展示我正在处理的内容。有什么帮助吗?我错过了你最后的评论。我已更新我的答案,以解决您最近的编辑问题。这种方法可以改变上一个问题的逻辑,因此,如果按下back键(自动调用onKeyDown),它会检查mp是否正在播放,如果正在播放,则会停止mp。我已经从主java文件中添加了代码,以向您确切显示我正在处理的内容。有什么帮助吗?我正试图让它在任何android设备上,如果你按下后退按钮(因为所有android手机都有后退按钮),那么音频,如果播放,就会停止播放。谢谢,我按下后退按钮停止播放音频。现在,home按钮也是这样吗?我会重写onHomePressed吗?不,你不应该试图修改Home按钮的行为,我认为你不能使用标准API。Home按钮是一种关键功能,因此您最好尝试其他功能。