android - Handler not updating ActionBar title -
i writing code music player , seems working fine except actionbar. when song playing, thread probes service every second change in song , if there change in song, handler object changes ui elements.
final handler uihandler = new handler() { @override public void handlemessage(message msg) { bundle data = msg.getdata(); song = data.getparcelable("song_info"); songtext.settext(song.getsongtitle()); artisttext.settext(song.getsongartist()); seekbar.setmax(mservice.getduration()/1000); //all these work assert getsupportactionbar() != null; getsupportactionbar().settitle(mservice.getsongname()); //not updating super.handlemessage(msg); } };
what when there message thread, updates ui. can confirm works , invoked when need to. text views , seekbar updated required. however, getsupportactionbar().settitle(...) doesn't update title bar.
same method of setting action bar title works if in other methods of same class. missing here?
in advance!
update:
here's more code activity has, in case helps strike something.
private serviceconnection mconnection = new serviceconnection() { @override public void onserviceconnected(componentname componentname, ibinder ibinder) { musicservice.musicbinder mbinder = (musicservice.musicbinder)ibinder; mservice = mbinder.getservice(); pausebtn = (imagebutton)findviewbyid(r.id.pause); seekbar.setmax(mservice.getduration()/1000); counterthread cthread = new counterthread(); thread counter = new thread(cthread); counter.start(); if(mservice.ispaused()) { pausebtn.setimageresource(r.drawable.ic_play_arrow_white_36dp); } else { pausebtn.setimageresource(r.drawable.ic_pause_white_36dp); } } @override public void onservicedisconnected(componentname componentname) { } }; private class counterthread implements runnable { @override public void run() { while(true) { try { if(!mservice.getsongname().equals(song.getsongtitle())) //this invoked when there change in song.{ message msg = uihandler.obtainmessage(); bundle b = new bundle(); b.putparcelable("song_info", mservice.getsong()); msg.setdata(b); //i receive message in handler uihandler.sendmessage(msg); } seekbar.setprogress(mservice.getcurrposn()/1000); thread.sleep(1000); } catch (exception e){ e.printstacktrace(); } } } } @override protected void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.song_playing); song = getintent().getparcelableextra("song_info"); songtext = (textview) findviewbyid(r.id.songname); artisttext = (textview) findviewbyid(r.id.artistname); songtext.settext(song.getsongtitle()); artisttext.settext(song.getsongartist()); header = getsupportactionbar(); seekbar = (seekbar)findviewbyid(r.id.seekbar); seekbar.setonseekbarchangelistener(new seekbar.onseekbarchangelistener() { @override public void onprogresschanged(seekbar seekbar, int i, boolean b) { // nothing } @override public void onstarttrackingtouch(seekbar seekbar) { // nothing } @override public void onstoptrackingtouch(seekbar seekbar) { int progress = seekbar.getprogress(); mservice.seek(progress*1000); } }); assert header != null; header.setdisplayoptions(actionbar.display_show_custom); header.setcustomview(r.layout.head_layout); titletext = (textview) findviewbyid(r.id.titletext); titletext.settext(song.getsongtitle()); } /* more operations */ public void next(view v) { mservice.nextsong(); pausebtn.setimageresource(r.drawable.ic_pause_white_36dp); assert header != null; header.settitle(mservice.getsongname()); // works fine songtext.settext(mservice.getsongname()); artisttext.settext(mservice.getartistname()); titletext.settext(mservice.getsongname()); seekbar.setmax(mservice.getduration()/1000); }
don't mind slight indentation offset.
Comments
Post a Comment