2011-10-25 22 views
31

Estoy desarrollando un widget con una imagen en el lado derecho, que puede ser elegida por el usuario en una de las pantallas de configuración. La imagen se puede configurar desde el usuario con ImageView.setScaleType ("CENTER"). Eso funciona. La URL de la imagen se almacena en las preferencias como URL y también como cadena codificada en Base64 del mapa de bits (porque quiero encoger la imagen y el usuario puede rotarla en la configuración)Android RemoteViews, cómo configurar ScaleType de un ImageView dentro de un widget?

En el widget, Yo cargo la imagen Eso funciona bien Con el URI y con el mapa de bits también. El ScaleType de ImageView también se establece en un valor fijo en el Diseño, también funciona.

Pero, ¿cómo puedo definir el ScaleType de la ImageView en el widget programáticamente? Causa Quiero establecer ScaleType en el valor, el usuario ha elegido en la configuración. Con RemoteViews, no podemos obtener el ImageView ...

Traté:


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


El archivo de registro dice: La setScaleType función no es posible para ImageView.

¿Alguien sabe cómo hacer esta definición dentro del AppWidget?

Respuesta

42

Puede utilizar este segmento para establecer el tipo de escala para la Vista de imagen mediante programación ..

imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

creo que sirve ...

+10

Esta es la manera de establecer el tipo de escala para un 'ImageView' normal, pero el cuestionario preguntaba por' RemoteViews'. –

8

Si nos fijamos en el código fuente de ImageView, se puede ver la El método setScaleType carece de la anotación @android.view.RemotableViewMethod, por lo que no se puede llamar a través de la interfaz RemoteViews.

Hay una solución para esta limitación, pero no es bonita: defina un XML de diseño diferente para cada ScaleType que desee, y elija entre ellos justo antes de crear el RemoteViews. Si su diseño es complejo, o si tiene más de una vista para aplicar esta solución, puede usar RemoteViews.addView para agregar el diseño particular ImageView dentro del diseño principal.

Estoy usando esta solución (con addView) para aplicaciones en mi aplicación Showr. El problema con este método es que el iniciador de stock tiene un error: si cambia el tipo de escala de un appwidget existente creando un nuevo RemoteViews y llamando al addView para agregarle un diseño diferente de ImageView, no siempre se da cuenta del el diseño ha cambiado.

+0

No estoy seguro si esto funcionaría, pero ¿qué hay de extender 'ImageView' y agregar la anotación, luego su' ImageView' personalizado llamaría a 'super.setScaleType (...)' – pjco

+2

No puede usar sus propias clases en un 'RemoteViews', solo los integrados en el sistema. –

+0

Ah, lástima, gracias por la información – pjco

1

Dado que no es una forma sencilla de llamar al setScaleType en la vista de eliminación, mi trabajo consistía en hacer tres imageViews en mi diseño y luego cambiar la visibilidad de aquellos que no tienen el tipo de escala seleccionado por el usuario:

// 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); 
    } 
Cuestiones relacionadas