web-dev-qa-db-fra.com

Android RemoteViews, comment définir ScaleType d'une ImageView dans un widget?

Je développe un widget avec une image sur le côté droit, qui peut être choisi par l'utilisateur dans l'un des écrans de paramètres. L'image peut ensuite être définie à partir de l'utilisateur avec ImageView.setScaleType ("CENTRE"). Ça marche. L'URL de l'image est ensuite stockée dans les préférences en tant qu'URL, et également en tant que chaîne encodée en Base64 du bitmap (car je veux réduire l'image et l'utilisateur peut la faire pivoter dans les paramètres)

Dans le widget, je charge l'image. Ça marche bien. Avec l'URI et avec le Bitmap aussi. Le ScaleType de l'ImageView est également défini sur une valeur fixe dans la mise en page, fonctionne également.

Mais comment puis-je définir le ScaleType de l'ImageView dans le widget par programme? Parce que je veux définir le ScaleType à la valeur, l'utilisateur a choisi dans les paramètres. Avec RemoteViews, nous ne pouvons pas obtenir l'ImageView ...

J'ai essayé:


myRemoteViews.setString (R.id.myImage, "setScaleType", "CENTER");


Le fichier journal indique: La fonction setScaleType n'est pas possible pour ImageView.

Est-ce que quelqu'un sait comment faire cette définition dans l'AppWidget?

43
user1013443

Vous pouvez utiliser ce segment pour définir le type d'échelle pour la vue d'image par programme.

 imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

J'espère que ça aide...

60
ShivRaj

Si vous regardez le code source de ImageView, vous pouvez voir que la méthode setScaleType n'a pas la @Android.view.RemotableViewMethod annotation, elle ne peut donc pas être appelée via l'interface RemoteViews.

Il existe une solution de contournement pour cette limitation, mais ce n'est pas joli: définissez un XML de mise en page différent pour chaque ScaleType souhaité, et choisissez entre eux juste avant de créer le RemoteViews. Si votre mise en page est complexe ou si vous avez plusieurs vues auxquelles appliquer cette solution de contournement, vous pouvez utiliser RemoteViews.addView pour ajouter la disposition particulière ImageView à l'intérieur de la disposition principale.

J'utilise cette solution de contournement (avec addView) pour les widgets d'application dans mon application Showr . Le problème avec cette méthode est que le lanceur d'actions a un bug: si vous changez le type d'échelle d'un appwidget existant en créant un nouveau RemoteViews et en appelant addView pour lui ajouter une disposition ImageView différente, il ne se rend pas toujours compte que la disposition a changé.

9
Dan Hulme

Étant donné qu'il n'y a pas de moyen simple d'appeler setScaleType sur la vue de suppression, le travail que j'ai trouvé consistait à créer trois imagesViews dans ma mise en page, puis à modifier la visibilité de celles qui n'avaient pas le type d'échelle sélectionné par l'utilisateur:

    // first I declared a map to associate preference values with imageView ids

    private static final HashMap<Integer,Integer> widgetImageViewIds;

    static {
        widgetImageViewIds = new HashMap<Integer, Integer>();
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_START, R.id.imageViewStart);
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_CENTER, R.id.imageViewCenter);
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_END, R.id.imageViewEnd);
    }

    ...

    // then when I update my widget show/hide the widgets based on the preference

    for (HashMap.Entry<Integer, Integer> entry : widgetImageViewIds.entrySet()) {
        Integer imageViewAlignment = entry.getKey();
        Integer imageViewId = entry.getValue();
        views.setViewVisibility(imageViewId, imageViewAlignment.intValue() != imageAlignmentPreferenceValue ? View.GONE : View.VISIBLE);
    }
1
Code Commander