2017-07-28 8 views
0

ボタンがいくつかあるポップアップウィンドウ(非アクティビティクラス)があります。そのうちの1つ(btn_audio)は、サウンドを再生または一時停止し、魅力的に機能します。
私のHomeActivityではplay()pause()の2つのメソッドを呼び出し、すべてのアクティビティではonStop()メソッドを呼び出したいと思います。それが機能しない場合は、play()pause()を他のアクティビティの発生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 

[OK]を、)(私はこの問題を解決するためにサービスを利用することを決定し、それがプレーに適しています。プレイ中にPlayerオブジェクトがnullであるため、SoundServiceからpause()メソッドを呼び出すことはできません。私はSoundServiceクラス(Popup_Menuクラスのss)からオブジェクトを作成すると思います。デフォルトのコンストラクタは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

ログcatメッセージを投稿 –

答えて

0

を作成することができます!完了しました。今はworking.itは新しいオブジェクトを作成する必要はありません。私は(オブジェクト)プレイヤーとpause()メソッドの修正とその中のすべてをSTATICに変更する必要があります。だから私はすべてのオブジェクトと変数にアクセスできます。 ありがとうございましたcricket_007 ...

2

まず、それは非アクティビティの場合はオフ、あなたが主張するように、そして渡し、活動を拡張しませんコンテキストがアクティビティより優先される

第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'のNullPointer?それでは、いくつかのブレークポイントを設定し、nullを参照することをお勧めします。 –

+0

'player'、' play_or_pause'などを初期化していないことに注目してください...これはちょうどこれをちょうどコピーした場合、もちろんNULLになるでしょう –

+0

dear cricket_007、I Popup_Menuクラスにコンテキストを渡して、あなたのコードのような崩壊であり、まだ動作していないことを発明しました。私のコードはHomeActivityで音楽を演奏してからクラッシュしました。私はPopup_MenuをActivityから拡張しました。理由はSharedPreferencesの "MODE_PRIVATE"が原因です(変数に解決できません)。このメニューはすべてのアクティビティにHomeActivityだけでなく、自分のbtn_audioがどこでも音楽をコントロールする必要があります。 –

関連する問題