android - 如何自动推进 ListView 应用程序小部件,如 Honeycomb 上的 StackView 应用程序小部件?

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

我正在寻找一种方法来定期动画/自动推进 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/

相关文章:

java - 排序时如何忽略第一个单词

android - Dagger2 - DoubleCheck 中的重复实例

objective-c - 加载 View 时重置 UILabels 的边界会出现故障 (iOS)

android - 不支持 React-native Animation.event 样式属性

android - 在 minSdkVersion ="4"应用程序中继承自 @android :style/Theme. Holo.Light

android - sharedElment 过渡使用不过渡的 fragment

java - 带有 byte[] WHERE 子句的 SQLite 查询

javascript - 拉斐尔对象不会沿着路径正确地设置动画

android - 蜂窝操作栏不显示(困惑)

android - 是否可以在 Galaxy Tab 中安装 Eclipse IDE?