通过 remoteview Android 更新小部件

Posted

技术标签:

【中文标题】通过 remoteview Android 更新小部件【英文标题】:Widget update via remoteview Android 【发布时间】:2014-05-28 05:59:15 【问题描述】:

我希望我的活动“but1”通过我的 but1 活动中的按钮更新小部件按钮上的文本。我试过了,它没有显示错误,但小部件仍然没有更新。清单文件中缺少我的东西吗?此外,日志猫也没有显示任何问题 以下是我在 But1.class 中的代码

et1.setOnClickListener(new OnClickListener() 

    Intent in=new Intent();

            Bundle extras=in.getExtras();


            if(extras!=null)
            
                awID=extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
            
                aw=AppWidgetManager.getInstance(context);
                @Override
                public void onClick(View arg0) 
                    // TODO Auto-generated method stub



                    RemoteViews rv=new RemoteViews(context.getPackageName(),R.layout.activity_main);
                    rv.setTextViewText(R.id.button1, "Mughazf,f,jvnl");
                    aw.updateAppWidget(awID, rv);
                    Intent result=new Intent();
                    result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
                    setResult(RESULT_OK,r

esult);

我的小部件是:

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) 
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        final int N = appWidgetIds.length;

        for (int i=0; i<N; i++) 
            int appWidgetId = appWidgetIds[i];

 Intent intent = new Intent(context, But1.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);


           RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main);
            views.setOnClickPendingIntent(R.id.button2, pendingIntent);

 appWidgetManager.updateAppWidget(appWidgetId, views);


        
    


【问题讨论】:

我的回答对你有帮助吗? 【参考方案1】:

问题应该出在 Widget App ID 上。您需要牢记Widget ID,以便以后更新。

您的Widget Provider onUpdate() 方法应将Widget id 存储在shared preferencedatabase

我在这里使用shared preference

 SharedPreferences prefs = context.getSharedPreferences("private preference", Context.MODE_PRIVATE);
 // here i am saving one widget id. change your logic to store all the widget id's
 prefs.edit().putInt("WidgetId",appWidgetId).commit();

然后当Activity 启动并单击按钮时。您可以像这样更新widget layout

首先从shared Preference阅读Widget ID

 SharedPreferences prefs = getSharedPreferences("private preference", Context.MODE_PRIVATE);
 int awID = prefs.getInt("WidgetId", AppWidgetManager.INVALID_APPWIDGET_ID);

然后,创建RemoteView 的实例并将新文本设置为TextView

 RemoteViews rv=new RemoteViews(getPackageName(),R.layout.widget_layout);
 rv.setTextViewText(R.id.textView1, "Some one updated Me");

然后,获取AppWidget Manager的实例

  AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());

最后,用新的RemoteView Layout 更新Widget

  appWidgetManager.updateAppWidget(awID, rv);

所以,awID - 是我们从onUpdate 方法得到的Widget Id

这应该可行。如果您发现任何问题,请告诉我。

【讨论】:

以上是关于通过 remoteview Android 更新小部件的主要内容,如果未能解决你的问题,请参考以下文章

《android开发艺术探索》读书笔记--RemoteViews

为啥 AppWidgetManager 会更新所有 RemoteViews for Widgets 的 Intent?

简单理解RemoteView

Android:将位图从本地存储加载到应用小部件(RemoteViews)

Android 小部件:RemoteViews 上的动画? [复制]

小部件更新的 RemoteViews 超出最大位图内存使用错误