很抱歉这个问题,可能会在几分钟内得到解答。 我是Android App开发的新手,并且一直在寻找答案大约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();
- >代码中的错误:
- > *此行有多个标记 - 主要无法解决一个类型 - 线路断点:声音[line:15] - mp_create(MainActivity)*
Toast.makeText(MainActivity.this,“test”,Toast.LENGTH_SHORT).show();
- >代码中的错误:
- > 在范围
中无法访问MainActivity类型的封闭实例为了使“Sound.java”中的Toast-和MediaPlayer-Calls工作,我该怎么做?
提前多多感谢。
斯文
答案 0 :(得分:2)
选项1 在“声音”
上添加“上下文”作为参数public class Sound{
private Context mContext;
Sound(Context context){
mContext = context;
}
...
Toast.makeText(mContext, text, length).show();
...
}
当您从活动中创建Sound
时,您将执行new Sound(this);
选项2
在Sound中定义一个接口以提供回调
public class Sound {
interface OnSoundListener{
public void onSoundStarted();
public void onSoundStopped();
}
}
您的主要活动看起来像
public class MainActivity implements Sound.OnSoundListener{
@Override
public void onSoundStarted(){
//your toast here
}
}
就我个人而言,我更喜欢第二种,这样就可以将逻辑与UI分开。
答案 1 :(得分:1)
不确定这是否有效,只是一个想法。
首先从MainActivity扩展Sound类
public class Sound extends MainActivity {
第二,这是我用来Toast工作的代码:
Toast.makeText(MainActivity.this,"Your Text Here",Toast.LENGTH_LONG).show();
答案 2 :(得分:0)
对于Toast,这是你需要做的:
Toast toast=Toast.makeText(this, "Hello toast", 2000);
toast.show();
如果有帮助,请查看此tutorial 教程。