2011-02-19 18 views
19

Ho uno stile chiamato Red and Green e ho una statistica if per scoprire quale applicare, ma non conosco il codice per applicare effettivamente uno stile da java.Come si applica uno stile a livello di programmazione?

+6

duplicato esatto: http://stackoverflow.com/questions/2016249/how-to-programmatically-setting-style-attribute- in-a-view, http://stackoverflow.com/questions/3246447/how-to-set-the-style-attribute-programmatically-in-android, ecc. Si prega di cercare prima di chiedere –

+0

controllare questo link. http://www.anddev.org/view-layout-resource-problems-f27/how-to-programmatically-set-button-style-t8656.html questo dovrebbe aiutare –

risposta

5

Ho scoperto che è possibile eseguire questa operazione solo durante la creazione di una vista dall'interno di Java. Se è definito in XML prima della mano, non è possibile modificare dinamicamente lo stile.

+5

Come risponde la tua stessa domanda? –

12

È possibile applicare gli stili in modo programmatico a TextViews utilizzando il metodo setTextAppearance (contesto, residuo). (Il resId dello stile può essere trovato in R.style.YourStyleName)

31

Non esiste una soluzione di linea a questo problema, ma questo ha funzionato per il mio caso d'uso. Il problema è che il costruttore 'View (context, attrs, defStyle)' non fa riferimento a uno stile reale, vuole un attributo. Quindi, ci sarà:

  1. definire un attributo
  2. creare uno stile che si desidera utilizzare
  3. Applicare uno stile per l'attributo sul nostro tema
  4. creare nuove istanze della nostra vista con quell'attributo

In 'res/valori/attrs.xml', definire un nuovo attributo:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="customTextViewStyle" format="reference"/> 
    ... 
</resources>  

In res/Valori/styles.xml 'ho intenzione di creare lo stile che voglio usare il mio TextView personalizzato

<style name="CustomTextView"> 
    <item name="android:textSize">18sp</item> 
    <item name="android:textColor">@color/white</item> 
    <item name="android:paddingLeft">14dp</item> 
</style> 

In 'res/valori/themes.xml' o' res/valori/styles.xml', modificare il tema per la vostra applicazione/attività e aggiungere il seguente stile:

<resources> 
    <style name="AppBaseTheme" parent="android:Theme.Light"> 
     <item name="@attr/customTextViewStyle">@style/CustomTextView</item> 
    </style> 
    ... 
</resources> 

Infine, nella vostra TextView personalizzato, è ora possibile utilizzare il costruttore con l'attributo e riceverà il vostro stile. Qui, invece di sempre

public class CustomTextView extends TextView { 

    public CustomTextView(Context context, int styleAttribute) { 
     super(context, null, styleAttribute); 
    } 

    // You could also just apply your default style if none is given 
    public CustomTextView(Context context) { 
     super(context, null, R.attr.customTextViewStyle); 
    } 
} 

Con tutti questi componenti, è ora possibile fare una dichiarazione if/else per generare nuovi punti di vista in fase di esecuzione con lo stile che preferisci

CustomTextView ctv; 
if(useCustomStyles == true){ 
    ctv = new CustomTextView(context, R.attr.customTextViewStyle); 
}else{ 
    ctv = new CustomTextView(context, R.attr.someOtherStyle); 
} 

Vale la pena notare che ho utilizzato ripetutamente customTextView in diverse varianti e posizioni diverse, ma non è in alcun modo richiesto che il nome della vista corrisponda allo stile o all'attributo o altro. Inoltre, questa tecnica dovrebbe funzionare con qualsiasi visualizzazione personalizzata, non solo con TextViews.

+0

Per me l'utilizzo di '' non ha funzionato, ho dovuto rimuovere '@ attr' perché funzioni, quindi è solo' ' – virhonestum

0

inserire questo codice

super.setStyle(R.style.yourownstyle) 

prima setContentView() in onCreate

Problemi correlati