
update – I figured out that there is something wrong with the setter of the pending intent- every time I click on the imagevIEw- the intent sends the extre details of the last defined Widget-
meaning that the other pending intents that where defined on the pre-added Widgets were run-over by the newer Widgets
我有一个应用程序小部件,显示用户选择的图片.(许多小部件 – 许多图片)
我的问题是:无论我在屏幕上显示哪个小部件 – 只有最后添加的小部件会更新:
这是我的代码
我的Widget xml提供程序代码
<appWidget-provIDer xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:initialLayout="@layout/Widget_Test" androID:minHeight="146dip" androID:minWIDth="146dip" androID:updatePeriodMillis="0" />
我的Manifest xml代码
<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" package="com.test" androID:versionCode="1" androID:versionname="1.0" > <uses-sdk androID:minSdkVersion="8" /> <uses-permission androID:name="androID.permission.BIND_REMOTEVIEWS" > </uses-permission> <application androID:icon="@drawable/icon" androID:label="@string/app_name" > <activity androID:name=".ActivitIEs.WidgetConfig" androID:screenorIEntation="portrait" > <!-- prbbly delete this line --> <action androID:name="androID.appWidget.action.APPWidget_CONfigURE" /> </activity> <!-- Test Widget --> <receiver androID:name=".Simple.Widget" androID:label="@string/app_Widget_Test" > <intent-filter> <action androID:name="androID.appWidget.action.APPWidget_UPDATE" /> </intent-filter> <Meta-data androID:name="androID.appWidget.provIDer" androID:resource="@xml/Widget_Test_provIDer" /> </receiver> <service androID:name=".Simple.Widget$TestWidgetService" /> </application></manifest>
小部件提供者
public class Widget extends appwidgetprovider{ public static String PREFENCES_Widget_CONfigURE = "ActionConfigureWidget"; public static int[] Widgets; @OverrIDe public voID onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIDs) { Intent svcIntent = new Intent(context,TESTWidgetService.class); Widgets = appWidgetIDs; context.startService(svcIntent); } public static class TESTWidgetService extends Service { @OverrIDe public voID onStart(Intent intent,int startID) { super.onStart(intent,startID); // Update the Widget RemoteVIEws remoteVIEw = buildremoteVIEw(this); // Push update to homescreen Mngr.getInstance().pushUpdate(remoteVIEw,getApplicationContext(),Widget.class); // No more updates so stop the service and free resources stopSelf(); } public RemoteVIEws buildremoteVIEw(Context context) { RemoteVIEws remoteVIEws = new RemoteVIEws(context.getPackagename(),R.layout.Widget_TEST); if (Widgets != null) { int length = Widgets.length; for (int i = 0; i < length; i++) { Intent configIntent = new Intent(context,WidgetConfig.class); configIntent.setAction(Widget.PREFENCES_Widget_CONfigURE); String number = AppWidgetManager.EXTRA_APPWidget_ID + "number"; configIntent.putExtra(number,length); String WidgetID = AppWidgetManager.EXTRA_APPWidget_ID + i; int ID = Widgets[i]; configIntent.putExtra(WidgetID,ID); PendingIntent runTESTPendingIntent = PendingIntent .getActivity(context,configIntent,PendingIntent.FLAG_UPDATE_CURRENT); remoteVIEws.setonClickPendingIntent(R.ID.TESTWIDgetimage,runTESTPendingIntent); Mngr controller = Mngr.getInstance(); controller.updateTESTWidget(context,remoteVIEws); } } return remoteVIEws; } @OverrIDe public voID onConfigurationChanged(Configuration newConfig) { int oldOrIEntation = this.getResources().getConfiguration().orIEntation; if (newConfig.orIEntation != oldOrIEntation) { // Update the Widget RemoteVIEws remoteVIEw = buildremoteVIEw(this); // Push update to homescreen Mngr.getInstance().pushUpdate(remoteVIEw,Widget.class); } } @OverrIDe public IBinder onBind(Intent arg0) { // Todo auto-generated method stub return null; } }} 我的配置活动
public class WidgetConfig extends ListActivity // implements{ private Bundle m_extras; private ArrayList<Test> m_tests = null; private int mAppWidgetID = AppWidgetManager.INVALID_APPWidget_ID; ImageAdapter m_adapter; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.imageList); Resources res = getResources(); Mngr mngr = Mngr.getInstance(); mngr.setResources(res); Context ctx = getApplicationContext(); mngr.setContext(ctx); getTests(); m_adapter = new ImageAdapter(ctx,R.layout.row,m_tests); ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT; m_adapter.getimageDownloader().setMode(mode); setlistadapter(m_adapter); Intent intent = getIntent(); m_extras = intent.getExtras(); } private voID getTests() { m_tests = new ArrayList<Test>(); Resources res = getResources(); String[] Testnames = res.getStringArray(R.array.fav_Test_array); TypedArray imgs = getResources().obtainTypedArray( R.array.fav_Test_integer); for (int i = 0; i < Testnames.length; i++) { Test o1 = new test(); String Testname = Testnames[i]; int resID = imgs.getResourceID(i,-1); o1.setTestname(Testname); o1.setimgID(resID); m_tests.add(o1); } imgs.recycle(); } @OverrIDe protected voID onListItemClick(ListVIEw l,VIEw v,int position,long ID) { listadapter adapt = l.getAdapter(); Object obj = adapt.getItem(position); if (obj != null) { Mngr mngr = Mngr.getInstance(); Context context = getApplicationContext(); String key = context.getString(R.string.TestWidget_string) + "_" + AppWidgetManager.EXTRA_APPWidget_ID; Test Test = (Test) obj; String val = Test.getimgID().toString(); mngr.putString(context,key,val); updateWidget(); } super.onListItemClick(l,v,position,ID); } private voID updateWidget() { Context ctx = getApplicationContext(); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(ctx); setResult(RESulT_CANCELED); if (m_extras != null) { Intent resultValue = new Intent(); int numberOfWidgets = m_extras.getInt( AppWidgetManager.EXTRA_APPWidget_ID + "number",AppWidgetManager.INVALID_APPWidget_ID); for (int i = 0; i < numberOfWidgets; i++) { String stringID = AppWidgetManager.EXTRA_APPWidget_ID + i; mAppWidgetID = m_extras.getInt(stringID,AppWidgetManager.INVALID_APPWidget_ID); /*************************************************************/ /*I Don't really kNow if I am using this pIEce of code right */ Uri data = Uri.withAppendedpath(Uri.parse("ABCD" + "://Widget/ID/"),String.valueOf(mAppWidgetID)); resultValue.setData(data); /*************************************************************/ RemoteVIEws vIEws = new RemoteVIEws(ctx.getPackagename(),R.layout.Widget_Test); Mngr.getInstance().updateTestWidget(ctx,vIEws); appWidgetManager.updateAppWidget(mAppWidgetID,vIEws); resultValue.putExtra(stringID,mAppWidgetID); } setResult(RESulT_OK,resultValue); finish(); } }} 我的Mngr代码
public voID updateTestWidget(Context context,RemoteVIEws remoteVIEws){ String key = context.getString(R.string.TestWidget_string) + "_" + AppWidgetManager.EXTRA_APPWidget_ID; String s = getString(context,""); if (s != null && s.equals("") == false) { int resID = Integer.valueOf(s); remoteVIEws.setimageVIEwResource(R.ID.TestWIDgetimage,resID); }}public voID pushUpdate(RemoteVIEws remoteVIEw,Context ctx,Class<?> cls){ Componentname myWidget = new Componentname(ctx,cls); AppWidgetManager manager = AppWidgetManager.getInstance(ctx); manager.updateAppWidget(myWidget,remoteVIEw);}解决方法 问题不在于您的configActivity,问题出在您的WidgetProvIDer中.我遇到了和你一样的问题但是使用你指定的 link解决了.您需要在buildremoteVIEw中的configIntent上设置“Hacked”意图. 总结 以上是内存溢出为你收集整理的多个Android Widget实例仅更新最后一个小部件全部内容,希望文章能够帮你解决多个Android Widget实例仅更新最后一个小部件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)