Android/Java:如何从类引用MainActivity.Java
对不起,这个问题可能在几分钟内就得到了回答。 我是Android应用程序开发新手,已经搜索了大约2个小时的答案,但我没有找到解决方案 这就是我的问题: 我创建了一个布局非常简单的MainActivity,只有一个启动/停止声音的切换按钮。我通过在MainActivity类中调用MediaPlayer实现了这一点。 现在我想把MediaPlayer处理放在一个单独的类中,这样它也可以从一个小部件中调用。 当举杯或调用MediaPlayer方法时,我需要引用MainActivity,它(在MainActivity本身中)是“this”。 但我不知道如何引用MainActivity的实例 代码如下:Android/Java:如何从类引用MainActivity.Java,java,android,class,Java,Android,Class,对不起,这个问题可能在几分钟内就得到了回答。 我是Android应用程序开发新手,已经搜索了大约2个小时的答案,但我没有找到解决方案 这就是我的问题: 我创建了一个布局非常简单的MainActivity,只有一个启动/停止声音的切换按钮。我通过在MainActivity类中调用MediaPlayer实现了这一点。 现在我想把MediaPlayer处理放在一个单独的类中,这样它也可以从一个小部件中调用。 当举杯或调用MediaPlayer方法时,我需要引用MainActivity,它(在MainA
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处理的类:
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(此“测试”,Toast.LENGTH_SHORT).show()强>
-->执行以下操作时引发运行时错误:
-->03-12 20:23:18.412:E/AndroidRuntime(862):java.lang.RuntimeException:无法启动活动组件信息{com.heavyloadreverse/com.heavyloadreverse.MainActivity}:java.lang.NullPointerException
Toast.makeText(main.this,“test”,Toast.LENGTH_SHORT).show()强>
-->代码错误:
-->*此行有多个标记
-无法将main解析为类型
-行断点:声音[行:15]-
mp_创建(主活动)*
Toast.makeText(MainActivity.this,“test”,Toast.LENGTH_SHORT.show()强>
-->代码错误:
-->在作用域中无法访问MainActivity类型的封闭实例
为了使“Sound.java”中的Toast和MediaPlayer调用正常工作,我必须做些什么
先谢谢你
Sven对于Toast,您需要做的是:
Toast toast=Toast.makeText(this, "Hello toast", 2000);
toast.show();
如果有帮助,请查看本教程 对于Toast,您需要做的是:
Toast toast=Toast.makeText(this, "Hello toast", 2000);
toast.show();
如果有帮助,请查看本教程 不确定这是否有效,只是一个想法 首先,从你的主要活动中扩展你的声音课程
public class Sound extends MainActivity {
其次,这是我用于Toast to工作的代码:
Toast.makeText(MainActivity.this,"Your Text Here",Toast.LENGTH_LONG).show();
不确定这是否有效,只是一个想法 首先,从你的主要活动中扩展你的声音课程
public class Sound extends MainActivity {
其次,这是我用于Toast to工作的代码:
Toast.makeText(MainActivity.this,"Your Text Here",Toast.LENGTH_LONG).show();
选项1
在“声音”上添加“上下文”作为参数
public class Sound{
private Context mContext;
Sound(Context context){
mContext = context;
}
...
Toast.makeText(mContext, text, length).show();
...
}
当您从活动中创建声音时,您将像新声音一样进行操作(此)代码>
选项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
在“声音”上添加“上下文”作为参数
public class Sound{
private Context mContext;
Sound(Context context){
mContext = context;
}
...
Toast.makeText(mContext, text, length).show();
...
}
当您从活动中创建声音时,您将像新声音一样进行操作(此)代码>
选项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分开。如果我从MainActivity中调用Toast,这是可行的。如果我从Sound类中调用它,我会得到一个运行时错误,正如我前面提到的。对“this”的引用就是问题所在。我明白了,您可以尝试getApplicationContext()而不是这个。我不会站在电脑前验证这个,但你们可以试试。我今晚回家后会试一试。谢谢。如果我在主活动中叫Toast,这就行了。如果我从Sound类中调用它,我会得到一个运行时错误,正如我前面提到的。对“this”的引用就是问题所在。我明白了,您可以尝试getApplicationContext()而不是这个。我不会站在电脑前验证这个,但你们可以试试。我今晚回家后会试一试。谢谢。我想,我昨天试过了。也会遇到一些错误,但我今晚回家后会试一试。谢谢。这是一个非常糟糕的主意,这样做会在系统中引入一个新的活动(包含所有需要的对象),需要比需要更多的资源。我想,我昨天试过了。也会遇到一些错误,但我今晚回家后会试一试。谢谢。这是一个非常糟糕的主意,这样做会在系统中引入一个新的活动(包含所有需要的对象),需要比需要更多的资源。