【发布时间】:2012-03-29 06:59:33
【问题描述】:
很抱歉这个问题,可能会在几分钟内得到回答。 我是 Android 应用开发的新手,一直在寻找大约 2 小时的答案,但我没有找到解决方案。
所以,这是我的问题: 我创建了一个布局非常简单的 MainActivity,只有一个 ToggleButton 来启动/停止一些声音。我从 MainActivity-Class 中调用 MediaPlayer。 现在我想把 MediaPlayer-Handling 放到一个单独的类中,这样它也可以从小部件中调用。 当举起 Toast 或调用 MediaPlayer-Method 时,我需要参考 MainActivity,它(在 MainActivity 本身中)是“this”。 但是我不知道如何引用 MainActivity 的实例。
代码如下:
package com.heavyloadreverse;
//import java.io.IOException;
import android.app.Activity;
//import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
//import android.widget.Toast;
import android.widget.ToggleButton;
public class MainActivity extends Activity {
//private MediaPlayer mp;
private Sound snd;
private ToggleButton btn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (ToggleButton) findViewById(R.id.btn_OnOff);
snd = new Sound();
snd.mp_create(MainActivity.this);
}
public void onToggleClicked(View v) {
// Perform action on clicks
if (((ToggleButton) v).isChecked()) {
snd.mp_start();
} else {
snd.mp_stop();
}
}
/*********************************************************************************
public void mp_create() {
mp = MediaPlayer.create(this, R.raw.truckreverse);
}
public void mp_start () {
Toast.makeText(this, R.string.start, Toast.LENGTH_SHORT).show();
// start the sound
mp.setLooping(true);
mp.start();
}
public void mp_stop () {
Toast.makeText(this, R.string.stop, Toast.LENGTH_SHORT).show();
// stop the sound
mp.stop();
try {
mp.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void mp_init() {
btn.setChecked(false);
}
**********************************************************************************/
public void btn_init() {
btn.setChecked(false);
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onRestart() {
super.onRestart();
btn_init();
}
@Override
public void onResume() {
super.onResume();
btn_init();
}
@Override
public void onPause() {
super.onPause();
snd.mp_stop();
}
@Override
public void onStop() {
super.onStop();
snd.mp_stop();
}
@Override
public void onDestroy() {
super.onDestroy();
snd.mp_stop();
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
}
}
MediaPlayer-Handling 的类:
package com.heavyloadreverse;
import java.io.IOException;
import android.app.Application;
import android.media.MediaPlayer;
import android.widget.Toast;
import com.heavyloadreverse.R;
public class Sound extends Application {
private MediaPlayer mp;
public void mp_create (MainActivity main) {
Toast.makeText(main.this, "test", Toast.LENGTH_SHORT).show();
mp = new MediaPlayer();
try {
mp = MediaPlayer.create(this, R.raw.truckreverse);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
public void mp_start () {
Toast.makeText(MainActivity.this, R.string.start, Toast.LENGTH_SHORT).show();
// start the sound
try {
mp.setLooping(true);
mp.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
public void mp_stop () {
//Toast.makeText(this, R.string.stop, Toast.LENGTH_SHORT).show();
try {
// stop the sound
mp.stop();
mp.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();
--> 执行时引发运行时错误:
--> 03-12 20:23:18.412: E/AndroidRuntime(862): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.heavyloadreverse/com.heavyloadreverse.MainActivity}: java。 lang.NullPointerException
Toast.makeText(main.this, "test", Toast.LENGTH_SHORT).show();
--> 代码错误:
--> *此行有多个标记 - main 无法解析为类型 - 行断点:声音 [line: 15] - mp_create(MainActivity)*
Toast.makeText(MainActivity.this, "test", Toast.LENGTH_SHORT).show();
--> 代码错误:
--> 在范围内没有可以访问 MainActivity 类型的封闭实例
为了使“Sound.java”中的 Toast- 和 MediaPlayer-Calls 正常工作,我需要做什么?
非常感谢。
斯文
【问题讨论】: