2011-10-25 16 views
31

Sto sviluppando un widget con un'immagine sul lato destro, che può essere scelto dall'utente in una delle impostazioni. L'immagine può quindi essere impostata dall'utente con ImageView.setScaleType ("CENTER"). Che funzioni. L'URL dell'immagine viene quindi memorizzato nelle preferenze come URL e anche come Stringa codificata Base64 della Bitmap (perché voglio ridurre l'immagine e l'utente può ruotarlo nelle impostazioni)Android RemoteViews, come impostare ScaleType di un ImageView all'interno di un widget?

Nel widget, Carico l'immagine. Funziona bene Con l'URI e anche con la Bitmap. Anche ScalaType di ImageView è impostato su un valore fisso nel layout, funziona anche.

Ma come posso definire il ScaleType di ImageView nel widget a livello di programmazione? Causa Desidero impostare ScaleType sul valore, l'utente ha scelto le impostazioni. Con RemoteViews, non possiamo ottenere l'ImageView ...

ho provato:


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


Il file di log dice: La setScaleType funzione non è possibile per ImageView.

Qualcuno sa come rendere questa definizione all'interno di AppWidget?

risposta

42

È possibile utilizzare questo segmento per impostare il tipo di scala per Punto di vista programmatico ..

imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

Speranza che aiuta ...

+10

Questo è come impostare il tipo di scala per un normale 'ImageView', ma l'interrogante chiedeva di un' RemoteViews'. –

8

Se si guarda il codice sorgente di ImageView, si può vedere il Il metodo setScaleType non ha l'annotazione @android.view.RemotableViewMethod, quindi non può essere richiamato tramite l'interfaccia RemoteViews.

C'è una soluzione alternativa per questa limitazione, ma non è carina: definire un XML di layout diverso per ogni ScalaType che si desidera e scegliere tra loro appena prima di creare lo RemoteViews. Se il layout è complesso o se si dispone di più di una vista per applicare questa soluzione alternativa, è possibile utilizzare RemoteViews.addView per aggiungere il particolare layout ImageView all'interno del layout principale.

Sto usando questa soluzione alternativa (con addView) per appwidgets nella mia app Showr. Il problema con questo metodo è che il lanciatore di azioni ha un bug: se tu cambia il il tipo di scala di una appwidget esistente creando un nuovo RemoteViews e chiamando addView per aggiungere un diverso layout ImageView ad esso, non sempre realizza il il layout è cambiato.

+0

Non sono sicuro se questo potrebbe funzionare, ma per quanto riguarda l'estensione di 'ImageView' e l'aggiunta dell'annotazione, il tuo' ImageView' personalizzato richiamerebbe 'super.setScaleType (...)' – pjco

+2

Non puoi usare le tue classi in un 'RemoteViews', solo quelli integrati nel sistema. –

+0

Ah, peccato, grazie per le informazioni però – pjco

1

Dal momento che non è un modo semplice per chiamare setScaleType nella vista di rimozione, il lavoro che ho realizzato è stato realizzare tre immagini nel mio layout e quindi modificare la visibilità di quelle che non hanno il tipo di scala selezionato dal utente:

// 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); 
    } 
Problemi correlati