【问题标题】:How to auto advance a ListView app widget like the StackView app widgets on Honeycomb?如何自动推进 ListView 应用小部件,如 Honeycomb 上的 StackView 应用小部件?
【发布时间】:2011-06-15 10:01:48
【问题描述】:

我正在寻找一种方法来定期为 ListView 应用小部件设置动画/自动推进,就像使用 StackView 应用小部件一样。

例如,Android Market 和 YouTube 小部件每隔 20 秒就会自动移动到集合中的下一个项目(在 Honeycomb 上)。

我在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 应用小部件完成或模拟吗?

非常感谢,
洛朗

【问题讨论】:

    标签: android animation android-3.0-honeycomb android-appwidget


    【解决方案1】:

    我找到了一种解决方案,但它可能并不理想!

    我在AppWidgetProvider的onEnable()中设置了重复报警,在onDisabled()中取消。该警报会触发一个 BroadcastReceiver,它会更新小部件视图并在 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 class WidgetAutoScroller extends 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<appWidgetIds.length ; i++) {
                int appWidgetId = appWidgetIds[i];
                RemoteViews rv = CascadeWidgetProvider.getWidgetView(context, appWidgetId);
                rv.setRelativeScrollPosition(R.id.widget_collection, 1);
                appWidgetManager.updateAppWidget(appWidgetId, rv);
            }
        }
    }
    

    如果您对我的问题有更好的解决方案,请回答。

    编辑:另一个问题是:当我到达列表末尾时该怎么办?
    我想转到列表的第一项,但我不知道如何从 RemoteView 或 appWidgetId 获取列表的当前位置...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多