Ajuster dynamiquement le contenu et la mise en page du widget à la taille définie par l'utilisateur via redimensionner. Android

Guide de modèle de conception Android dit que le contenu et la mise en page du widget peuvent être ajustés dynamiquement à la taille définie par l'utilisateur grâce à l'opération de redimensionnement ici: Guide de conception pour les widgets

Exemple fourni dans le guide de conception: Exemple d'image fourni dans le guide de conception.

Mais je ne vois rien dans les documents sur la façon d'accomplir cela. Comment Pouvons-nous changer la mise en page selon l'opération de redimensionnement? Toutes les idées concernant l'approche seront appréciées.

25
demandé sur Gogu 2013-01-11 05:15:24

2 réponses

Grâce à A--C, ceci est possible pour les périphériques Jellybean et ci-dessus et est simple à implémenter. Voici l'exemple de code utilisant la méthode onAppWidgetOptionsChanged

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onAppWidgetOptionsChanged(Context context,
        AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {

    Log.d(DEBUG_TAG, "Changed dimensions");

    // See the dimensions and
    Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);

    // Get min width and height.
    int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
    int minHeight = options
            .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);

            // Obtain appropriate widget and update it.
    appWidgetManager.updateAppWidget(appWidgetId,
            getRemoteViews(context, minWidth, minHeight));

    super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,
            newOptions);
}

/**
 * Determine appropriate view based on width provided.
 * 
 * @param minWidth
 * @param minHeight
 * @return
 */
private RemoteViews getRemoteViews(Context context, int minWidth,
        int minHeight) {
    // First find out rows and columns based on width provided.
    int rows = getCellsForSize(minHeight);
    int columns = getCellsForSize(minWidth);

    if (columns == 4) {
        // Get 4 column widget remote view and return
    } else {
                    // Get appropriate remote view.
        return new RemoteViews(context.getPackageName(),
                R.layout.quick_add_widget_3_1);
    }
}

/**
 * Returns number of cells needed for given size of the widget.
 * 
 * @param size Widget size in dp.
 * @return Size in number of cells.
 */
 private static int getCellsForSize(int size) {
  int n = 2;
  while (70 * n - 30 < size) {
    ++n;
  }
  return n - 1;
 }
22
répondu Gogu 2013-08-08 17:51:59

@Choletski @ azendh

Après avoir modifié les mises en page, certains événements de clic ne sont plus appelés

J'ai résolu ce problème en créant une fonction qui setOnClickPendingIntent sur afficher, puis le retourner.

Par exemple, le code est comme

private RemoteViews getConfiguredView (RemoteViews remoteViews, Context context){

    Intent refreshIntent = new Intent(context, EarningsWidget.class);
    refreshIntent.setAction(REFRESH_ACTION);
    PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 3, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    remoteViews.setOnClickPendingIntent(R.id.refreshButton, toastPendingIntent);
    return remoteViews;
}

Et que la fonction est appelée où vous faites " obtenir la vue à distance appropriée."

return getConfiguredView(new RemoteViews(context.getPackageName(), R.layout.activity_widget), context);
0
répondu Jack the Ripper 2016-05-30 15:25:23