我正在运行运行音频的服务。我在片段的布局中创建了一个TextView
,它应该显示正在播放的曲目的标题。
目前,当用户从片段中选择曲目或点击跳到下一个或上一个按钮时,我已设置要更新的TextView
:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//other stuff
String[] topText = getResources().getStringArray(R.array.topText_array);
songNowPlayingLabel.setText("Now Playing : " + topText[position]);
}
button_skipNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
musicService.playNext();
songNowPlayingLabel.setText("Now Playing : " + topText[musicService.songPosn]);
}
});
但是,当前曲目完成且“服务”自动播放下一首曲目时,TextView
不会更新。此外,该应用程序还使用自定义通知,该通知在应用程序不再在屏幕上但在服务中播放音乐时显示。在这种情况下,当按下下一个/上一个的通知按钮时,TextView
不会更新。
我希望每当轨道从通知按钮更改或轨道完成时更新TextView
。为此我创建了一个广播监听器并将其添加到onStartCommand
的{{1}}。但是这对MusicService.java
没有影响。
我在同一个问题上经历过其他一些主题,但无法解决此问题。我做错了什么?
TextView的xml
TextView
MusicService.java的相关部分
<TextView
android:id="@+id/songNowPlayingLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="#eeeeee"
android:textStyle="bold"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusableInTouchMode="true"/>
Fragment.java
static final public String BROADCAST_ACTION = "com.myapplication.broadcastSongNowPlayingLabel";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//... other stuff
intent = new Intent(BROADCAST_ACTION);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
问题与发送或接收广播无关,问题是即使在片段中收到广播后, @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// other stuff
bManger = LocalBroadcastManager.getInstance(getActivity());
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MusicService.BROADCAST_ACTION);
bManger.registerReceiver(broadcastReceiver, intentFilter);
}
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(MusicService.BROADCAST_ACTION)) {
String[] topText = getResources().getStringArray(R.array.topText_array);
songNowPlayingLabel.setText("Now Playing : " + topText[musicService.songPosn]);
}
}
};
LocalBroadcastManager bManger;
也不会更新。
答案 0 :(得分:0)
您正在片段中使用LocalBroadcastManager。
在MusicService.java中使用以下内容:
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
代替
sendBroadcast(intent);
答案 1 :(得分:0)
经过大量挖掘,我想出了什么
在MusicService.java中
@Override
public void onCreate() {
super.onCreate();
songPosn = 0 // defined as a public integer
//other stuff
topText = getResources().getStringArray(R.array.topText_array);
intent = new Intent(BROADCAST_ACTION);
}
然后我进入了我的playSong()方法。这是每次用户对音频执行某些操作时调用的方法,因此我认为这将导致解决我的问题。
public void playSong() {
//other stuff
intent.putExtra("nowPlaying", topText[songPosn]);
sendBroadcast(intent);
}
然后在我的fragment.java文件中
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//other stuff
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateUI(intent);
}
};
}
private void updateUI(Intent intent){
String nowPlaying = intent.getStringExtra("nowPlaying");
songNowPlayingLabel.setText("Now Playing : " + nowPlaying);
}