【问题标题】:Just update a widget RemoteViews instead of completly creating a new one?只是更新一个小部件 RemoteViews 而不是完全创建一个新的?
【发布时间】:2010-12-25 00:14:32
【问题描述】:

所以在我的 AppWidgetProvider 类的 onUpdate 方法中,我最终执行了大量的代码,这样我就可以完全重新创建一个新的 RemoteViews 对象。现实情况是,我真的只需要在每次更新时在 RemoteViews 中的一个文本视图中设置文本。无论如何只修改特定小部件已经使用的 RemoteViews?

-库蒂斯

【问题讨论】:

    标签: android android-widget onupdate


    【解决方案1】:

    首先,RemoteView 不是视图。它是一组构建视图层次结构的指令。它用于在另一个进程中重新创建视图(App Widgets 不会在您的应用进程中执行)。因此它是可序列化和可变的。

    因此,当您初始化 RemoteView 时,只需在某处存储对它的引用,例如在您的自定义 AppWidgetProvider 的字段中。 下次您需要它时,从现场获取它并对其进行更改。要更改 TextView 中的字符串,请使用 setString(..)

    remoteView.setString(textViewId, "setText", "some text for TextView")
    

    【讨论】:

    • 所以我在广播接收器中创建了这个 remoteView,这当然是短暂的。将静态变量中的引用保存到该障碍的解决方案中吗?
    • 是的,没关系。 RemoteViews 完全脱离应用程序/活动上下文,不会泄漏内存。
    • 我认为这个广播接收器是短暂的(仅持续 onReceive,然后弹出一个新实例),引用会在某个时候被销毁吗?
    • 我很想这样做,但是静态变量假定您只有一个小部件,不是吗?如果有多个小部件,每个小部件都有自己的 RemoteViews 实例,这将不起作用。我很想将 RemoteViews 保存为 AppWidgetOptions 的 parcelable,它是按小部件 ID 设置的。
    • @Mike 肯定是的,当实例消失时,这个答案中建议的对 RemoteViews 的引用也是如此......
    【解决方案2】:

    如果您使用当前的 API,这是 2013 年的更新。在将执行更新的 WidgetProvider 类的方法中:

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    rv = new RemoteViews(context.getPackageName(), R.layout.widgetlayout); 
    rv.setTextViewText(R.id.ofTextViewInWidgetLayoutXML, "Hello World");
    appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], rv);
    

    注意,它不再是 remoteView.setString 而是 remoteView.setTextViewText

    【讨论】:

    • 这里的关键部分是partiallyUpdateAppWidget
    【解决方案3】:

    你可以更新远程视图然后调用

    ComponentName componentName= new ComponentName(context, YourClass.class);
    AppWidgetManager.getInstance(context).updateAppWidget(componentName, remoteViews);
    

    on,AFAIK 应该更新小部件

    【讨论】:

    • 这并不能真正解决我的问题,因为我仍然需要创建你命名为“remoteViews”的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2022-12-09
    • 2013-03-23
    相关资源
    最近更新 更多