首页 文章

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

提问于
浏览
0

对不起,这个问题可能会在几分钟内得到解答 . 我是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-Call工作正常,我该怎么做?

非常感谢提前 .

斯文

3 回答

  • 2

    Option 1 在'Sound'上添加'Context'作为参数

    public class Sound{
        private Context mContext;
        Sound(Context context){
            mContext = context;
        }
    
        ...
        Toast.makeText(mContext, text, length).show();
        ...
    }
    

    当您从活动中创建 Sound 时,您将执行 new Sound(this);

    Option 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分开 .

  • 0

    不确定这是否有效,只是一个想法 .

    首先从你的MainActivity扩展你的Sound类

    public class Sound extends MainActivity {
    

    第二,这是我用于Toast工作的代码:

    Toast.makeText(MainActivity.this,"Your Text Here",Toast.LENGTH_LONG).show();
    
  • 1

    对于Toast,这是您需要做的:

    Toast toast=Toast.makeText(this, "Hello toast", 2000);
    
         toast.show();
    

    检查这个tutorial教程是否有帮助 .

相关问题