【问题标题】:Call method from non-Activity class in AndroidAndroid中非Activity类的调用方法
【发布时间】:2017-07-28 13:13:32
【问题描述】:

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

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

好的,我决定使用 service 来解决这个问题,它适用于 play()。但是在播放时,我仍然无法从 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

【问题讨论】:

  • 你能包括你的堆栈跟踪吗?
  • 请缩进你的代码,很难阅读
  • 发布您的 logcat 消息
  • 请立即停止,不要将活动引用存储在其他活动的字段中以试图控制它们
  • 无活动?不,你不... Popup_Menu extends Activity

标签: java android call


【解决方案1】:

首先,关闭,如果它是非 Activity,请不要扩展 Activity,如您所声称的,然后传递 Context 优于 Activity

其次,有一个名为 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)

【讨论】:

  • 一模一样? Popup_Menu.play 中的空指针?那我建议你设置一些断点,看看什么是null
  • 请注意,我还没有初始化playerplay_or_pause 等......如果你只是复制了这个,这些当然是空的
  • 亲爱的 cricket_007,我将上下文传递给 Popup_Menu 类并发明了它的结构,就像你的代码一样,但仍然无法正常工作,并且在没有音乐播放的情况下给出了相同的异常。但是我的代码在 HomeActivity 中播放音乐然后崩溃了。在上面添加,我从 Activity 扩展了我的 Popup_Menu,为什么 SharedPreferences 的“MODE_PRIVATE”导致(无法解析为变量)错误。这个菜单必须在 All Activity 的 HomeActivity 中准备好,而且它自己的 btn_audio 必须在任何地方控制音乐。
  • 你需要静态导入Context.MODE_PRIVATE...如果它实际上不是一个Activity,你不应该扩展Activity
  • 另外,如果你想让 Fragment 类出现在所有活动中并拥有自己的布局功能,听起来你真的想要一些 Fragment 类
【解决方案2】:

是的……!!!完毕。它现在工作了。它不需要创建新对象。我必须将 (object)player 和 pause() 方法的 modifire 以及其中的所有内容更改为 STATIC。所以现在我可以访问所有对象和变量。 谢谢 cricket_007...

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多