首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HomeScreen Widget -仅在新实例时更新

HomeScreen Widget -仅在新实例时更新
EN

Stack Overflow用户
提问于 2015-05-10 03:48:37
回答 1查看 53关注 0票数 0

我有一个小部件在我的主屏幕上,负责显示当前的歌曲,是可以切换歌曲等.目前,我只是试图实现它的能力,以显示当前的歌曲。

我已经附上了所有相关代码..。还有评论。没有引发错误,而且它确实会更新,但只有在我在主屏幕上创建小部件的新实例时才会这样做。为了解释我是否在开始播放歌曲之前放置了一个小部件,当我开始播放应用程序中的歌曲时,它会说“不播放”,但它仍然会继续说“不播放”,然后当我创建一个类型和位置相同的新小部件时,它将保留更新的信息,而旧的小部件仍然会说不播放。这继续如果我改变歌曲,我jsut放置的将不会更新,也不会是一个不播放,但创建一个新的将显示更新.

MainActivity接收MusicManager的呼叫并发送小部件更新(works?)

代码语言:javascript
复制
 public MusicManager musicManager = MusicManager.getInstance(new MusicManager.MediaplayerUpdateInterface() {

    public void updateUI(int type) {
        updateMediaplayerViews(type);
    }
});

public void updateMediaplayerViews(int type) {
    switch(type) {
        case 0:
            this.runOnUiThread(new Runnable() {
                public void run() {
                    System.out.println("value? "+(musicManager.getCurrentTimeBAR()/musicManager.getSongLengthBAR()));
                    SongListFragment.musicManagerProgress.setProgress((int)((musicManager.getCurrentTimeBAR()/(double)musicManager.getSongLengthBAR())*100));
                    SongListFragment.musicManagerCurrent.setText(musicManager.getCurrentTime());
                    if(!SongListFragment.hasSetImage) {
                        SongListFragment.musicManagerTotal.setText(musicManager.getSongLength());
                        SongListFragment.musicManagerSongName.setText(musicManager.getCurrentSongInfo().getName().length() > 22 ? musicManager.getCurrentSongInfo().getName().substring(0, 19) + "..." : musicManager.getCurrentSongInfo().getName());
                        new DownloadListAdapter.DownloadImageTask(SongListFragment.musicManagerImageView).execute(musicManager.getCurrentSongInfo().getImgurl());
                        SongListFragment.hasSetImage = true;
                    }
                }
            });
            break;
        case 10:
            this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Intent intent = new Intent(getBaseContext(), TrinityWidget.class);
                    intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
                    int[] ids = {TrinityWidget.widgetId};
                    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
                    getBaseContext().sendBroadcast(intent);
                }
            });
            break;
    }
}

MusicManager发送更新(Works)

代码语言:javascript
复制
    public static MusicManager myInstance;

private boolean songHasChanged;
public MusicManager(MediaplayerUpdateInterface inter) {
    this.player = new MediaPlayer();
    this.uiUpdateInterface = inter;
    executorService.submit(new Runnable() {
        @Override
        public void run() {
            while (true) {
                if(songHasChanged) {
                    uiUpdateInterface.updateUI(10);
                    songHasChanged = false;
                }
                if (player.isPlaying()) {
                    uiUpdateInterface.updateUI(0);
                }
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    });
}

public static MusicManager getInstance(MediaplayerUpdateInterface inter) {
    if (myInstance == null)
        return myInstance = new MusicManager(inter);
    else
        return myInstance;
}

Widget代码(有问题?)

代码语言:javascript
复制
public class TrinityWidget extends AppWidgetProvider {

public static boolean needsImage;
public static final int widgetId = 188772;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    // There may be multiple widgets active, so update all of them
    final int N = appWidgetIds.length;
    for (int i = 0; i < N; i++) {
        updateAppWidget(context, appWidgetManager, appWidgetIds[i]);
    }
}


// the below method is where it updates i believe it does work but the updates don't apply until A new widget is created?

public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                   int appWidgetId) {
    try {
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.trinity_widget);

        if (MusicManager.myInstance != null) {
            views.setTextViewText(R.id.widgetsongtext, MusicManager.myInstance.getCurrentSongInfo() != null ? MusicManager.myInstance.getCurrentSongInfo().getName() : "Not Playing");
            views.setTextViewText(R.id.widgetartisttext, MusicManager.myInstance.getCurrentSongInfo() != null ? MusicManager.myInstance.getCurrentSongInfo().getArtist() : "Not Playing");
        } else {
            views.setTextViewText(R.id.widgetsongtext, "Not Playing");
            views.setTextViewText(R.id.widgetartisttext, "Not Playing");
        }
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onEnabled(Context context) {

}

@Override
public void onDisabled(Context context) {
    // Enter relevant functionality for when the last widget is disabled
}

}

基本上,在我手动重新创建小部件之前,所有的小部件都不会更新。新的被更新了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-10 21:50:07

问题是由于某种原因我没有更新正确的ID ..。不管是哪种方式,我现在都是基于类更新的。就像下面这样

代码语言:javascript
复制
ComponentName projectWidget = new ComponentName(context, TrinityWidget.class);
        appWidgetManager.updateAppWidget(projectWidget, views);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30147527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档