显示图像列表时出现应用小部件问题
Posted
技术标签:
【中文标题】显示图像列表时出现应用小部件问题【英文标题】:App Widget issue while showing list of images 【发布时间】:2013-03-09 13:24:21 【问题描述】:我浏览了以下 android 文档:“App Widgets with Collections”来创建一个显示文本列表的小部件。一切正常,并且按照我想要的方式工作。
现在我不想显示文本列表,而是显示存储在 sd 卡中的图像列表。 那么如何在我实现的代码中做到这一点。如果有人对此有一些想法,请帮我解决这个问题。
我写的代码:
WidgetProvider.java
public class WidgetProvider extends AppWidgetProvider
public static String EXTRA_WORD=
"com.commonsware.android.appwidget.lorem.WORD";
@Override
public void onUpdate(Context ctxt, AppWidgetManager appWidgetManager,
int[] appWidgetIds)
for (int i=0; i<appWidgetIds.length; i++)
Intent svcIntent=new Intent(ctxt, WidgetService.class);
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews widget=new RemoteViews(ctxt.getPackageName(),
R.layout.widget);
widget.setRemoteAdapter(appWidgetIds[i], R.id.words,
svcIntent);
Intent clickIntent=new Intent(ctxt, LoremActivity.class);
PendingIntent clickPI=PendingIntent
.getActivity(ctxt, 0,
clickIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
widget.setPendingIntentTemplate(R.id.words, clickPI);
appWidgetManager.updateAppWidget(appWidgetIds[i], widget);
super.onUpdate(ctxt, appWidgetManager, appWidgetIds);
WidgetService.java
public class WidgetService extends RemoteViewsService
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent)
return(new WidgetDisplay(this.getApplicationContext(),
intent));
WidgetDisplay.java
public class WidgetDisplay implements RemoteViewsService.RemoteViewsFactory
private static final String[] items="Red", "Green", "Blue", "Pink", "Orange";
private Context ctxt=null;
private int appWidgetId;
public WidgetDisplay(Context ctxt, Intent intent)
this.ctxt=ctxt;
appWidgetId=intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
@Override
public void onCreate()
// no-op
@Override
public void onDestroy()
// no-op
@Override
public int getCount()
return(items.length);
@Override
public RemoteViews getViewAt(int position)
RemoteViews row=new RemoteViews(ctxt.getPackageName(),
R.layout.row);
row.setTextViewText(android.R.id.text1, items[position]);
Intent i=new Intent();
Bundle extras=new Bundle();
extras.putString(WidgetProvider.EXTRA_WORD, items[position]);
i.putExtras(extras);
row.setOnClickFillInIntent(android.R.id.text1, i);
return(row);
@Override
public RemoteViews getLoadingView()
return(null);
@Override
public int getViewTypeCount()
return(1);
@Override
public long getItemId(int position)
return(position);
@Override
public boolean hasStableIds()
return(true);
@Override
public void onDataSetChanged()
// no-op
XML 文件
Widget.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/words"
android:layout_
android:layout_
android:layout_marginTop="3dp"
android:layout_marginLeft="3dp"
android:background="@drawable/widget_frame"
/>
Row.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_
android:layout_
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:paddingLeft="6dip"
android:minHeight="?android:attr/listPreferredItemHeight"
/>
Widget_provider.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="146dip"
android:minHeight="146dip"
android:updatePeriodMillis="0"
android:initialLayout="@layout/widget"
android:autoAdvanceViewId="@+id/words"
android:previewImage="@drawable/preview"
android:resizeMode="vertical"
/>
我得到的小部件的屏幕截图
【问题讨论】:
嘿,如果有任何疑问,请尝试使用我的代码,然后告诉我。 【参考方案1】:我习惯了这种方式,效果很好。
在 row.xml
中将 textview 更改为 imageviewpublic WidgetDisplay(Context ctxt, Intent intent)
this.ctxt=ctxt;
appWidgetId=intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
setImageinView(this.ctxt);
private void setImageinView(Context context)
//read sd card and store bitmap in arrayListBitmap;
@Override
public RemoteViews getViewAt(int position)
remoteView = new RemoteViews(ctxt.getPackageName(), R.layout.row);
remoteView.setImageViewBitmap(R.id.image_photo1,arrayListBitmap.get(i));
很简单,你必须将 sd 卡存储数据读入 arraylist。
将大小设置为 getCount()。
现在在您的图像视图中设置图像。
如果有任何疑问欢迎。
【讨论】:
是的......它的工作,我还有两个问题,1.如果我在我的应用程序上进行了一些更改,那么我的应用程序小部件退出时不会更新。我必须从主屏幕中删除小部件,然后再次添加小部件,然后小部件中才会发生更新 2. 单击小部件如何打开我的应用程序。 1.如果您手动更新(刷新按钮)或使用计时器,主屏幕应用小部件每 30 分钟更新一次。但使用定时器会消耗更多电量。 其实我想在我的应用退出时更新它。假设在我的应用程序中我有三个图像,并且在小部件上我正在显示这三个图像。现在用户打开应用程序并删除一张图像。现在,一旦我退出应用程序,我希望用两个图像更新小部件。我的意思是我想从活动中更新小部件。 我使用了相同的功能,但我使用的是数据库,所以删除/插入图像我可以获取图像然后显示。 我知道,但是你如何在活动完成时更新应用程序小部件......我很困惑......以上是关于显示图像列表时出现应用小部件问题的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 Shiny 应用程序中显示来自 SQL Server 查询的数据框时出现问题