2017-07-28 68 views
0

我有一個彈出窗口(非活動類),它具有一些按鈕。其中一個(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消息 –

回答

0

呀...!完成。它現在工作,不需要創建新的對象。我必須改變(對象)播放器的修改和停頓()方法和其中的所有內容,以靜態。所以現在我可以訪問所有的對象和變量。 謝謝cricket_007 ...

2

首先,關閉,如果它是一個非活動不延長的活動,如你要求,然後通過上下文優於活動

其次,有一個名爲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必須在任何地方控制音樂。 –

相關問題