【问题标题】:Update Android Widget From Activity从 Activity 更新 Android 小部件
【发布时间】:2011-05-03 16:48:54
【问题描述】:

我有一个小部件,它的设置是当我点击它时,它会在活动中打开一些设置。

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);

这会为应用程序配置一些设置。我想要实现的是让小部件更新其视图以在我启动的 Activity 关闭时反映更改的设置。使用更新间隔或任何其他类型的轮询不适合此。

我在这里和在 android 文档中看到了这个代码使用的几个地方:

appWidgetManager.updateAppWidget(mAppWidgetId, views);

但我不知道如何获取 mAppWidgetId 值。我尝试在http://developer.android.com/guide/topics/appwidgets/index.html 处按照小部件配置活动的示例进行操作,但在以下代码中,

    Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
    mAppWidgetId = extras.getInt(
            AppWidgetManager.EXTRA_APPWIDGET_ID, 
            AppWidgetManager.INVALID_APPWIDGET_ID);
}

extras 总是为空,所以我从来没有得到 AppWidgetID。

好的,现在我只是漫无目的。你觉得我能做什么?

【问题讨论】:

    标签: android android-activity widget


    【解决方案1】:

    我终于找到了我正在寻找的答案,它在 updateAppWidget 函数的重载中。

       appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);
    

    这让我无需知道 appWidgetID 即可访问小部件。我在活动中的最终代码是:

            // Create an Intent to launch ExampleActivity
        Intent intent = new Intent(this, Settings.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    
        views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
    
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
        appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);
        finish();
    

    我必须在 Widget 的 onUpdate 方法中进行所有相同的设置工作,但现在每次我退出我的活动时,Widget 都会显示正确的状态。

    【讨论】:

    • 感谢分享答案!!!我们必须把这段代码放在哪里,在小部件设置活动中还是在小部件类中???
    • 没关系,我把它放在 updateWidget 方法中,用“context”更改了一些“this”并删除了 'AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this)' 现在它正在工作......谢谢!跨度>
    • 如果您有多个小部件配置,您可能想尝试 appWidgetManager.getAppWidgetIds(component) 然后对其进行迭代。
    • @Kratz 我面临同样的问题,但无法弄清楚在我的代码stackoverflow.com/questions/15523736/…
    • 这不尊重DRY原则,真是令人沮丧,必须有办法
    【解决方案2】:

    还有另一种方法 - 在用于启动活动的待处理意图中传递小部件 ID:

    Intent clickIntent=new Intent(context, MyConfigActivity.class);
    clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    // you have the widgetId here, since it's your onUpdate
    PendingIntent pendingIntent=PendingIntent
            .getActivity(context, 0,
                    clickIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
    views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
    

    此外,为了避免 onUpdate() 中的代码重复,您可以将 Intent 广播回 AppWidgetProvider:

    Intent intent = new Intent(this,MyAppWidgetProvider.class);
    intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
    
    // Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,
    // since it seems the onUpdate() is only fired on that:
    int[] ids = {widgetId};
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
    sendBroadcast(intent);
    

    【讨论】:

    • 感谢分享代码。现在我可以从活动中更新小部件
    【解决方案3】:

    我知道这已经被回答和接受了。然而,当我搜索相同的东西时,我发现了一种非常简单的方法来更新小部件。

    对于未来的读者:

    最好的部分是,这适用于小部件的所有实例以及任何上下文(活动、服务等)

    代码如下,

    Context context = this;
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1);
    ComponentName thisWidget = new ComponentName(context, MyWidget.class);
    remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis());
    appWidgetManager.updateAppWidget(thisWidget, remoteViews);
    

    Courtesy - Stuck :)

    【讨论】:

    • 这个!!我一直在努力争取更新小部件上的 TextView,这解决了它。谢谢!! :)
    • 欢迎您。快乐是我的。快乐编码。 :)
    【解决方案4】:

    我更喜欢向小部件发送广播请求以进行更新,而不是从您的活动中进行调用。将触发 onUpdate 方法,并传递所有小部件布局。

    下面是我的代码:

    1- 从活动中发送广播:

    Intent intent = new Intent(ctxt, MyAppWidgetProvider.class);
    intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    
    int[] ids = {R.layout.appwidget};
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
    ctxt.sendBroadcast(intent);
    

    现在,2- 实现 onUpdate 方法:

    Intent i = new Intent(ctxt, Settings.class);
    PendingIntent pi = PendingIntent.getActivity(ctxt, 0, i, 0);
    
    for (int widgetId : allWidgetIds) {
        RemoteViews remoteViews = new RemoteViews(ctxt.getPackageName(), widgetId);
        remoteViews.setTextViewText(R.id.statusMsg, msg);
        remoteViews.setOnClickPendingIntent(R.id.rootView, pi);
        AppWidgetManager mngr = AppWidgetManager.getInstance(ctxt);
        ComponentName wdgt = new ComponentName(ctxt, MyAppWidgetProvider.class);
        mngr.updateAppWidget(wdgt, remoteViews);
    }
    

    就是这样!希望对你有帮助:)

    【讨论】:

      【解决方案5】:
      RemoteViews view = new RemoteViews("pakagename", R.layout.widget_layout_name);
      view.setTextViewText(R.id.textView_id, String.valueOf(hr + ":" + mi)); // for setting a textview
      view.setCharSequence(R.id.PunchIn, "setText", "Punch In"); //for setting a button name
      view.setInt(R.id.PunchIn, "setBackgroundResource", R.color.black); //for setting button color
      ComponentName theWidget = new ComponentName(getActivity(), AppWidget_name.class);
      AppWidgetManager manager = AppWidgetManager.getInstance(getActivity());
      manager.updateAppWidget(theWidget, view);
      

      【讨论】:

        猜你喜欢
        • 2011-12-29
        • 2015-04-03
        • 1970-01-01
        • 2012-07-18
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        相关资源
        最近更新 更多