2012-06-22 6 views
6

Ho la seguente visualizzazione personalizzata dei pulsanti.Applicare dinamicamente lo stile alle viste nel codice java

public class PrayerTimeLabel extends Button { 

int hours; 
int minutes; 
String dayHalf; //am or pm 
Context parentActivity; 
PrayerControl parentControl; 

public PrayerTimeLabel(Context context,PrayerControl parent) { 
    super(context);     
    init(context,parent,0); 
} 

public PrayerTimeLabel(Context context, int defStyle, PrayerControl parent) { 
    //super(context, null, R.style.Button_PrayerTimeButton); 
    super(context, null, defStyle);    
    init(context,parent,defStyle); 
} 


private void init(final Context context, PrayerControl parent, int defStyle) 
{   
    parentActivity = context; 
    parentControl = parent; 
    Typeface tf = Typeface.createFromAsset(context.getAssets(),"fonts/digital.ttf"); 
    this.setTypeface(tf);  
    this.setText(false); 

    this.setOnClickListener(new OnClickListener() {   
     public void onClick(View v) { 
      TimeDialog dialogBox = parentControl.getDialogBox(); 
      dialogBox.setTime(hours, minutes, dayHalf); 
      dialogBox.show(); 
     } 
    }); 
} 


public void setTime(int hrs, int min, String half,boolean signalParent) 
{ 
    hours = hrs; 
    minutes = min; 
    dayHalf = half; 
    this.setText(signalParent); 
} 

public void setText(boolean signalParent) 
{ 
    super.setText(String.format("%02d", hours)+":"+String.format("%02d", minutes)+" "+dayHalf); 
    if(signalParent){ 
     parentControl.setPrayerTime(hours, minutes, dayHalf); 
    } 
} 

} 

e ho lo stile segue definito nel mio style.xml

<style name="Button.PrayerTimeButton" parent="@android:style/TextAppearance.Widget.Button"> 
    <item name="android:background">#000</item> 
    <item name="android:textSize">18dp</item> 
    <item name="android:textColor">#FFFF00</item> 
</style> 

Il pulsante estesa non è sempre questo stile. Qualcuno può puntare su ciò che sto facendo male? Ho cercato la soluzione e ho trovato this. Qualcuno può suggerire qualcosa

Nota: non posso usare XML per applicare gli stili. Deve essere costruttore.

Edit:

In seguito è la classe in cui viene creato questo pulsante personalizzato e utilizzato. Ho cancellato molte righe di codice irrilevanti

public class PrayerControl extends LinearLayout { 


protected PrayerTimeLabel prayerTimeButton; 

protected String prayerName; 
protected static int counter=0; 


public PrayerControl(Context context) { 
    super(context); 
    init(context); 
} 

public PrayerControl(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    getXMLAttributes(context, attrs); 
    init(context); 
} 

    protected void getXMLAttributes(Context context, AttributeSet attrs) 
{ 
    TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.PrayerControl); 

    prayerName = a.getString(R.styleable.PrayerControl_name); 
    dayHalf = a.getString(R.styleable.PrayerControl_dayHalf); 
    hours = a.getInteger(R.styleable.PrayerControl_hours, 4); 
    minutes = a.getInteger(R.styleable.PrayerControl_minutes, 30); 

    ltrProgress = a.getInteger(R.styleable.PrayerControl_postNamazInterval, 0); 
    rtlProgress = a.getInteger(R.styleable.PrayerControl_preNamazInterval, 0); 
    intervalMax = a.getInteger(R.styleable.PrayerControl_intervalMax, 30); 


    a.recycle(); 

} 

protected void init(Context context) 
{ 
    counter++; 
    parentActivity = context; 
    this.setOrientation(LinearLayout.HORIZONTAL); 
    this.setId(counter);  

    prayerTimeButtonStyle = R.style.Button_PrayerTimeButton; 
    initializePrayerTimeButton(); 

} 


protected void initializePrayerTimeButton() 
{ 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.WRAP_CONTENT, 
      40);   
    params.gravity = Gravity.CENTER; 
    //params.weight = 1.0f; 

    prayerTimeButton = new PrayerTimeLabel(parentActivity,prayerTimeButtonStyle,this); 
    prayerTimeButton.setTime(hours, minutes, dayHalf,false); 

    prayerTimeButton.setLayoutParams(params); 
    this.addView(prayerTimeButton); 
} 

} 
+0

Cosa fa getxmlAttributes? – Ronnie

+0

ho aggiornato il codice per includere quella funzione. Legge solo il valore degli elementi nel file attr.xml. – sadaf

risposta

0

Si dovrebbe fare nel costruttore di una chiamata al costruttore super(context,attrs,defStyle), che si applicherà il defStyle al View.

Tuttavia non è possibile modificare dinamicamente lo style.

+0

Lo sto seguendo nella riga seguente super (contesto, null, R.style.Button_PrayerTimeButton); nel secondo costruttore. Puoi per favore indicare cosa c'è di sbagliato in questo codice? – sadaf

+0

posso vedere anche il codice in cui aggiungi quelle viste personalizzate a un layout? –

+0

In realtà, questo pulsante personalizzato fa parte di un altro controllo personalizzato che viene quindi aggiunto al layout. Ecco perché voglio applicare gli stili usando il costruttore e non usando XML. Lasciatemi aggiornare la domanda per aggiungere il codice ... – sadaf

3

Questa è una risposta vecchia: ho avuto un -1 un paio di minuti fa, e qui è la

NUOVA SOLUZIONE:

L'idea di base è quella di passare un attributo al costruttore . Controllare questo link per la soluzione completa: Applying style to views dynamically in java code

SOLUZIONE VECCHIO (non funzionante):

Aggiungi questi costruttori alla classe:

public StyledButton(Context context) { 
    super(context, null, R.style.Button_PrayerTimeButton); 
//... whatever 
} 

public StyledButton(Context context, AttributeSet attrs) { 
    super(context, attrs, R.style.Button_PrayerTimeButton); 
//... whatever 
} 

public StyledButton(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, R.style.Button_PrayerTimeButton); 
//... whatever 
} 
+0

Ho aggiunto questi costruttori ma non uso :( – sadaf

+0

+1 sul commento precedente, questo non funziona neanche per me. – adstro

+0

@adstro grazie per il -1, ho appena visto questo e la risposta aggiornata –

3

Perché non utilizzare setTextAppearance(Context context, int resid);. Ti consente di impostare il colore del testo, le dimensioni, lo stile, il colore suggerimento e il colore di evidenziazione.

In PrayerTimeLabel classe,

private void init(final Context context, PrayerControl parent, int defStyle) 
{   
    setTextAppearance(context, R.style.Button_PrayerTimeButton); 
    ... 
} 

Per ulteriori informazioni vedi questo post: setTextAppearance through code referencing custom attribute

+0

Non è solo textView, textview è il più semplice di tutto questo è il motivo per cui ho incollato il codice per textview.Ho altri controlli personalizzati che ereditano da SeekBar e altri controlli Android.Io sto avendo problemi a impostare gli stili per tutti loro. – sadaf

0

Il bug report si collega a stati:

Inoltre, quando si crea dinamicamente gli elementi in fase di esecuzione -time significa che non puoi semplicemente applicare uno stile nel codice. È necessario creare un layout XML separato per la vista si sta costruendo, e gonfiare è [...]

Con questo in mente, una soluzione potrebbe essere la seguente:

creare un layout xml per il tuo pulsante - chiamiamolo prayertimebutton.xml:

<Button android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#FFFF00" 
     //...etc 
/> 

Poi, nel metodo initializePrayerTimeButton nella classe PrayerControl, gonfiare e aggiungere il pulsante PrayerTimeLabel al layout PrayerControl:

//Retrieve a LayoutInflater instance that is hooked up to the current context 
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
//The LayoutInflater instantiates the layout file into a PrayerTimeLabel object 
PrayerTimeLabel button = (PrayerTimeLabel)inflater.inflate(R.layout.prayertimebutton, this, false); 
//add the PrayerTimeLabel to the PrayerControl 
this.addView(button); 

Si noti che il secondo parametro di LayoutInflater.inflate() è un riferimento al Vista genitore (gruppo).

La seguente risposta di adamp, un ingegnere di framework Android di Google, discute questo approccio in modo più dettagliato.

Why so complex to set style from code in Android

+0

Sì, ho letto che ma io non voglio usare i file di layout XML, deve essere fatto usando i costruttori, questo problema è stato segnalato nel 2010 , Sono sorpreso che non ci siano aggiornamenti a questo problema .. – sadaf

+0

Posso chiedere perché devi usare i costruttori? La mia comprensione era che occorreva istanziare il pulsante in modo dinamico con il proprio stile e aggiungerlo dinamicamente a un layout, che la soluzione nella mia risposta rende possibile. Dalla segnalazione di bug appare usando i costruttori per passare lo stile è un vicolo cieco. È davvero sorprendente che non vi siano aggiornamenti a questo. –

+0

perché ho circa 15 controlli personalizzati e gonfiare così tanti file XML non è buono in termini di risorse, quindi stavo pensando che qualcuno potrebbe aver trovato una soluzione per questo problema ma sembra che io abbia sbagliato :( – sadaf