我正在寻找一种方法来定期动画/自动推进 ListView 应用程序小部件,就像使用 StackView 应用程序小部件一样。
例如,Android Market 和 YouTube 小部件通过自动前进到集合中的下一个项目(在 Honeycomb 上)每 20 秒动画一次。
我在StackView Widget example看到过他们为 StackView 小部件使用 autoAdvanceViewId 设置:
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="150dip"
android:minHeight="150dip"
android:updatePeriodMillis="3600000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/widget_layout"
android:autoAdvanceViewId="@id/stack_view">
</appwidget-provider>
对于 ListView 应用小部件,可以以某种方式完成或模拟吗?
非常感谢,
洛朗
最佳答案
我找到了一种解决方案,但它可能并不理想!
我在 AppWidgetProvider 的 onEnable() 中设置了一个重复闹钟,并在 onDisabled() 中取消它。该警报会触发 BroadcastReceiver,它会更新小部件 View 并在 RemoteView 上使用 setRelativeScrollPosition()。
下面是几行代码:
在扩展 AppWidgetProvider 的类中
public void onEnabled(Context context) { [...] // create alarm that will move the widget list content every n seconds AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); long firstTime = SystemClock.elapsedRealtime(); firstTime += 10*1000; Intent i = new Intent(context, WidgetAutoScroller.class); PendingIntent widgetAutoScroll = PendingIntent.getBroadcast(context, 0, i, 0); alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 10*1000, widgetAutoScroll); super.onEnabled(context); } @Override public void onDisabled(Context context) { // deactivate the alarm that moves the widget content Intent i = new Intent(context, WidgetAutoScroller.class); PendingIntent widgetAutoScroll = PendingIntent.getBroadcast(context, 0, i, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(widgetAutoScroll); super.onDisabled(context); }
WidgetAutoScroller.java
公共(public)类 WidgetAutoScroller 扩展 BroadcastReceiver {
@Override
public void onReceive(Context context, Intent Intent ) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, CascadeWidgetProvider.class));
for( int i=0 ; i
如果您对我的问题有更好的解决方案,请回答。
编辑:另一个问题是:当我到达列表末尾时该怎么办?
我想转到列表的第一项,但我不知道如何从我的 RemoteView 或 appWidgetId 获取列表的当前位置 ...
关于android - 如何自动推进 ListView 应用程序小部件,如 Honeycomb 上的 StackView 应用程序小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6356006/