android - 应用程序小部件中的 ViewFlipper

标签 android viewflipper android-appwidget

我正在尝试构建一个新的小部件并且正在查看 Android app widget documentation ,特别是支持小部件类的部分。我注意到 ViewFlipper受支持,但我正在努力寻找有关如何在主屏幕小部件中使用它的任何示例。特别是,我想知道是否可以手动触发交换 View 。在一个 Activity 中,这看起来相对简单,一个示例是连接按钮的 onclick 监听器以调用脚蹼的 showNext()。

RemoteViews对象有 showNext 和 showPrevious 方法,但我不确定我是否理解如何将它们连接到用户与小部件交互时触发的事件。任何人都可以提供何时调用这些方法的示例吗?

看起来小部件中的按钮只能连接到 Intent 而不是代码来运行脚蹼。如果此限制为真,那么是否仅在应用小部件中使用 View 翻转器来自动翻转 View ?

最佳答案

假设您有 2 个按钮:LEFT 和 RIGHT。首先,您将为每个附加未决 Intent (此处它是从 Service#onStart 触发的:

@Override
public void onStart(Intent intent, int startId) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext());
    int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
    // add listeners for every widget registered
    for (int widgetId : allWidgetIds) {
        addClickListeners(appWidgetManager, widgetId, root);
    }
    stopSelf();
}

protected void addClickListeners(AppWidgetManager appWidgetManager, int widgetId, RemoteViews root) {
    root.setOnClickPendingIntent(R.id.left, getNavigationIntent(widgetId, R.id.left));
    root.setOnClickPendingIntent(R.id.right, getNavigationIntent(widgetId, R.id.right));
}

protected PendingIntent getNavigationIntent(int widgetId, final int id) {
    Intent clickIntent = new Intent(this, WidgetProvider.class);
    clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    clickIntent.putExtra(TRIGGER, id);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);
    return pendingIntent;
}

然后,在AppWidgetProvider中做

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Bundle extras = intent.getExtras();
    Integer id = (Integer) (extras == null ? null : extras.get(TRIGGER));
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action) && id != null) {
        int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, 0);
        onNavigate(context, widgetId, id); 
    } else {
        super.onReceive(context, intent);
    }
}


protected void onNavigate(Context context, Integer widgetId, Integer id) {  
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    RemoteViews root = new RemoteViews(context.getPackageName(), R.layout.app_widget);
    if (id == R.id.left) {
        root.showPrevious(R.id.scroll);
    } else {
        root.showNext(R.id.scroll);            
    }
    appWidgetManager.updateAppWidget(widgetId, root);
}

这应该可以做到。现在的问题是 - 这只适用于 API 11+,我刚刚发现 root.setInt(R.id.scroll, "setDisplayedChild", pos) 在 API 7 中不起作用.

关于android - 应用程序小部件中的 ViewFlipper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8282452/

相关文章:

android - 如何从 intentservice 开始 Activity ?

java - getIntent().getSerializedExtra 为 null

android - 识别 Android 中的 RTL 语言

java - 如何使用 Java 代码将键值对字符串数组从 strings.xml 导入 TextView

android - View 翻转器 : OutOfMemoryError: bitmap size exceeds VM budget

android - 使用 IntelliJ 预览 ViewFlipper

android - ViewFlipper.setDisplayedChild() 在 Android 中不起作用

Android SharedPreferences 不保存

android - 如何仅在首次创建应用小部件时显示 Activity ?

android - 如何获取我刚刚点击的AppWidget id?