Пишу приложение Android Studio. Надо добавить MusicController в приложении. При нажатии на кнопку запускается новая активность, а в ней - сам MusicController. По крайней мере так должно было быть. Но что-то пошло не по плану. Совершенно не понимаю, что логи пытаются мне сказать. Вот полный стактрэйс:
Код:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mopchik.mopchik/com.mopchik.mopchik.ControllerActivity}: android.view.WindowManager$BadTokenException: :confused:
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2916)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3051)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1811)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6694)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:806)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
at android.widget.MediaController.show(MediaController.java:364)
at com.mopchik.mopchik.Controller.show(Controller.java:39)
at com.mopchik.mopchik.ControllerActivity.onCreate(ControllerActivity.java:36)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2896)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3051)*
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)*
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)*
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)*
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1811)*
at android.os.Handler.dispatchMessage(Handler.java:106)*
at android.os.Looper.loop(Looper.java:193)*
at android.app.ActivityThread.main(ActivityThread.java:6694)*
at java.lang.reflect.Method.invoke(Native Method)*
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)*
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)*
Дальше попробую максимально подробно описать код, если лень читать, попробуйте дать хотя бы наводку, а то, повторюсь, совсем нет идей, как это исправить.
Структура, собственно, следующая. Есть MusicFragment - это фрагмент, в котором инициализируются все аудиозаписи устройства, затем они с помощью адаптера обрабатываются и передаются в ListView. Этот ListView я закидываю в модельный класс, так как он понадобится позже в другой активности. Уже в другой активности находится кнопка, повторюсь, она находится НЕ в MusicFragment, её обработчик тоже. При нажатии на неё из той самой НЕ-MusicFrament-активности запускается новая активность, в которой следующий код должен отобразить MusicController. Но он не отображает. Самое занятное, что тот же самый код исправно работает с MusicFragment. Так что я думаю, тут какая-то путаница с context-ами, также была мысль, что нельзя через модельные классы перекидывать View элементы. А вы как думаете? Как это исправить?
Код:
Controller controller=new Controller(this);
controller.setMusicSrv(Model.instance().getMusicSrv());
controller.setController();
controller.show();
Вот код класса Controller:
Код:
public class Controller implements MediaPlayerControl {
public MusicController controller;
public Context context;
public ListView songView;
public MusicService musicSrv;
public boolean playbackPaused = false;
public Controller(Context context) {
this.context = context;
}
public void setMusicSrv(MusicService musicSrv){this.musicSrv=musicSrv;}
public void show(){
controller.show(0);
}
private void playNext() {
musicSrv.playNext();
}
//play previous
private void playPrev() {
musicSrv.playPrev();
}
public void setController() {
songView = Model.instance().getSongView();
controller = new MusicController(context);
controller.setPrevNextListeners(new View.OnClickListener() {
@Override
public void onClick(View v) {
playNext();
}
}, new View.OnClickListener() {
@Override
public void onClick(View v) {
playPrev();
}
});
controller.setMediaPlayer(this);
controller.setAnchorView(songView);
controller.setEnabled(true);
}
@Override
public void start() {
musicSrv.go();
}
@Override
public void pause() {
musicSrv.pausePlayer();
}
@Override
public int getDuration() {
return musicSrv.getDur();
}
@Override
public int getCurrentPosition() {
return musicSrv.getPosn();
}
@Override
public void seekTo(int pos) {
musicSrv.seek(pos);
}
@Override
public boolean isPlaying() {
return musicSrv.isPng();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
}