Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.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/Java:如何从类引用MainActivity.Java_Java_Android_Class - Fatal编程技术网

Android/Java:如何从类引用MainActivity.Java

Android/Java:如何从类引用MainActivity.Java,java,android,class,Java,Android,Class,对不起,这个问题可能在几分钟内就得到了回答。 我是Android应用程序开发新手,已经搜索了大约2个小时的答案,但我没有找到解决方案 这就是我的问题: 我创建了一个布局非常简单的MainActivity,只有一个启动/停止声音的切换按钮。我通过在MainActivity类中调用MediaPlayer实现了这一点。 现在我想把MediaPlayer处理放在一个单独的类中,这样它也可以从一个小部件中调用。 当举杯或调用MediaPlayer方法时,我需要引用MainActivity,它(在MainA

对不起,这个问题可能在几分钟内就得到了回答。 我是Android应用程序开发新手,已经搜索了大约2个小时的答案,但我没有找到解决方案

这就是我的问题: 我创建了一个布局非常简单的MainActivity,只有一个启动/停止声音的切换按钮。我通过在MainActivity类中调用MediaPlayer实现了这一点。 现在我想把MediaPlayer处理放在一个单独的类中,这样它也可以从一个小部件中调用。 当举杯或调用MediaPlayer方法时,我需要引用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处理的类:

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()而不是这个。我不会站在电脑前验证这个,但你们可以试试。我今晚回家后会试一试。谢谢。我想,我昨天试过了。也会遇到一些错误,但我今晚回家后会试一试。谢谢。这是一个非常糟糕的主意,这样做会在系统中引入一个新的活动(包含所有需要的对象),需要比需要更多的资源。我想,我昨天试过了。也会遇到一些错误,但我今晚回家后会试一试。谢谢。这是一个非常糟糕的主意,这样做会在系统中引入一个新的活动(包含所有需要的对象),需要比需要更多的资源。