Android中非活动类的调用方法

问题描述:

我有一个弹出窗口(非活动类),它具有一些按钮。其中一个(btn_audio),播放或暂停声音,它的作用就像一个魅力。
现在我想在我的HomeActivity中调用两种方法,play()pause(),并在我的所有Activities中调用onStop()方法。它不起作用,请致电play()pause()在其他Activity中发生NullPointException。Android中非活动类的调用方法

public class Popup_Menu extends Activity implements OnClickListener { 
    Button btn_audio; 
    public static MediaPlayer player;  String play_or_pause; 
    int num_ply, tim_pos; int [] resID;// Audio 
    SharedPreferences sp; 
void showPopup(final Activity context) { 

    this.context=context; 
    LinearLayout viewGroup = (LinearLayout) context.findViewById(R.id.popup); 
     LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     layout = layoutInflater.inflate(R.layout.popup_layout_menu, viewGroup); 
    sp = context.getSharedPreferences("text", MODE_PRIVATE); 
     btn_audio = (Button) layout.findViewById(R.id.btn_audio); // audio 
     layout.findViewById(R.id.btn_audio).setOnClickListener(this); 


     @Override 
     public void onClick(View whichButtonIsClicked) { 
    switch (whichButtonIsClicked.getId()) { 
    case R.id.btn_audio:      
    if (play_or_pause.equals("play")) { 
     pause(); 
    } else { 
     play(context); 
    } 
    sp.edit().putString("play_or_pause", play_or_pause).commit(); // save current stat 
} ////// close of showPopup() 

      //define play and pause methods 
public void pause() { 
    player.pause(); 
    btn_audio.setBackgroundResource(R.drawable.icon_audio_pause); 
    play_or_pause="pause"; // current state is 'pause' 
      } 

public void play(final Context context) { 
    if(num_ply==9){num_ply=0; } 
    resID = new int []{ R.raw.tarane,R.raw.toofan,R.raw.shane,R.raw.kharazmi,R.raw.golhaye_khofte,R.raw.rang,R.raw.naghmeh,R.raw.dar_rahe_to,R.raw.emperor}; 
    player=MediaPlayer.create(context,resID[num_ply]); 
    player.seekTo(tim_pos);   
    player.start(); 
    btn_audio.setBackgroundResource(R.drawable.icon_audio_play); 
    play_or_pause="play";  // current state is 'play' 
    player.setOnCompletionListener(new OnCompletionListener() { 
    public void onCompletion(MediaPlayer player) { 
    tim_pos=0;   num_ply++;  play(context); 
      } 
     }); 
    } 
} 

和我HomeActivity:

public class HomeActivity extends Activity implements OnClickListener { 
Popup_Menu ppp; 
@Override 
protected void onCreate.............. 
ppp = new Popup_Menu(); 
SharedPreferences sp = getSharedPreferences("text", MODE_PRIVATE); 

if(sp.getString("play_or_pause", "play").equals("pause")){ 
    ppp.play(getApplicationContext());     // ERROR 
    } // audio 

} /// close of onCreate 

@Override 
public void onStop() { 
    super.onStop();        
    if(play_or_pause.equals("play")){ 
    ppp.tim_pos= ppp.player.getCurrentP 

好吧,我决定用服务来解决这个问题,它可以很好地用于播放()。但是在播放时,仍然无法从SoundService调用pause()方法,因为player对象为null。我认为通过从SoundService类创建一个对象(SS在Popup_Menu类中),默认构造函数将播放器值设置为null(当播放和播放器对象不为null时)。并调用player.pause发生错误。 如何请我暂停此one_week_friend !!!

public class SoundService extends Service { 

    MediaPlayer player;  int num_ply, tim_pos; int [] resID; 


public int onStartCommand(Intent intent, int flags, int startId) { 

    resID = new int []{ R.raw.tarane,R.raw.toofan,R.raw.shane,R.raw.kharazmi, 
      R.raw.golhaye_khofte,R.raw.rang,R.raw.naghmeh,R.raw.dar_rahe_to,R.raw.emperor  }; 
     player=MediaPlayer.create(this,resID[num_ply]); 

     play(); 
     return Service.START_FLAG_REDELIVERY; 
} 

public void play() { 
    if(num_ply==9){num_ply=0; } 
    player.seekTo(tim_pos);   
    player.start(); 
    player.setOnCompletionListener(new OnCompletionListener() {   
    public void onCompletion(MediaPlayer player) { 
     tim_pos=0;   num_ply++;  play(); 
    } 
    }); 
} 

    public void resume(){ 
    player.seekTo(tim_pos);   
    player.start(); 
} 

public void pause() { 
    tim_pos= player.getCurrentPosition();   ////// ERROR 
    player.pause();   ////// ERROR 
    num_ply++; 
} 


public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
    } 
} 

而且我Popup_Menu类:

@Override 
public void onClick(View whichButtonIsClicked) { 
    switch (whichButtonIsClicked.getId()) { 

    case R.id.btn_audio: 
    if (play_or_pause.equals("play")) { 
     btn_audio.setBackgroundResource(R.drawable.icon_audio_pause); 
     play_or_pause="pause";  // current state is 'pause' 
     SoundService ss = new SoundService(); 
     ss.pause();   ////// ERROR 
    } else { 
     btn_audio.setBackgroundResource(R.drawable.icon_audio_play); 
     play_or_pause="play";  // current state is 'play' 
     Intent sound_Intent = new Intent(context , SoundService.class);  // start service 
     context.startService(sound_Intent); 
    } 
     sp.edit().putString("play_or_pause", play_or_pause).commit(); // save current state 
    break; 

的logcat:

08-05 01:03:31.440: E/AndroidRuntime(25356): FATAL EXCEPTION: main 
08-05 01:03:31.440: E/AndroidRuntime(25356): java.lang.NullPointerException 
08-05 01:03:31.440: E/AndroidRuntime(25356): at com.codegostarNiloo.negar.SoundService.pause(SoundService.java:47) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at com.codegostarNiloo.negar.Popup_Menu.onClick(Popup_Menu.java:234) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at android.view.View.performClick(View.java:4209) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at android.view.View$PerformClick.run(View.java:17457) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at android.os.Handler.handleCallback(Handler.java:725) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at android.os.Looper.loop(Looper.java:153) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at android.app.ActivityThread.main(ActivityThread.java:5341) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at java.lang.reflect.Method.invokeNative(Native Method) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at java.lang.reflect.Method.invoke(Method.java:511) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
08-05 01:03:31.440: E/AndroidRuntime(25356): at dalvik.system.NativeStart.main(Native Method) 
08-05 01:03:32.066: D/dalvikvm(25356): threadid=11: interp stack at 0x5f1c9000 
+1

你能包括你的堆栈跟踪吗? – cjnash

+0

请缩进代码,很难阅读 – litelite

+0

发布您的logcat消息 –

呀...!完成。它现在工作,不需要创建新的对象。我必须改变(对象)播放器的修改和停顿()方法和其中的所有内容,以静态。所以现在我可以访问所有的对象和变量。 谢谢cricket_007 ...

首先,关闭,如果它是一个非活动不延长的活动,如你要求,然后通过上下文优于活动

其次,有一个名为DialogFragment的类,用于使用作为一个弹出式对话框

我认为你正在寻找的东西像下面,虽然

public class Popup_Menu implements OnClickListener { 
    Button btn_audio; 
    public MediaPlayer player;  
    String play_or_pause; 
    int num_ply, tim_pos; 
    int [] resID;// Audio 
    SharedPreferences sp; 
    Context context ; 

    public Popup_Menu(final Context context) { 

     this.context= context; 
     sp = this.context.getSharedPreferences("text", Context.MODE_PRIVATE); 

     // LinearLayout viewGroup = (LinearLayout) view.findViewById(R.id.popup); 

     LayoutInflater layoutInflater = LayoutInflater.from(this.context); 
     layout = layoutInflater.inflate(R.layout.popup_layout_menu, viewGroup); 
     btn_audio = (Button) layout.findViewById(R.id.btn_audio); // audio 
     btn_audio.setOnClickListener(this); 
} 

现在,您可以创建一个new Popup_Menu(HomeActivity.this)

+0

完全一样吗? 'Popup_Menu.play'中的空指针?然后,我建议你设置一些断点,看看什么是空的 –

+0

请注意,我还没有初始化'player','play_or_pause'等等......当然,如果你刚刚复制了这个, –

+0

亲爱的cricket_007,I将上下文传递给Popup_Menu类并发明它像你的代码一样的束缚,并且仍然不工作,并且在没有音乐播放的情况下给出相同的Exception。但我的代码在HomeActivity中播放音乐,然后崩溃。添加上面,我从Activity扩展我的Popup_Menu为什么SharedPreferences的“MODE_PRIVATE”导致(无法解析为变量)错误。此菜单必须在All Activity的HomePlay中进行预置,而且它自己的btn_audio必须在任何地方控制音乐。 –