CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: gianpassa con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 9 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 34 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 4 su 4
Discussione:

Colore LinearLayout

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Feb 2011
    Messaggi
    7

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Colore LinearLayout

    Salve, ho un problema di programmazione molto semplice ma che mi sta facendo uscire di testa.
    Ho comprato il libro di Massimo Carli sulla programmazione con Android e al capitolo 3 c'è un esempio di uso dei colori. Sull'esempio viene spiegato come cambiare il colore di sfondo del LinearLayout principale. Ho modificato il codice in modo che venga fatto in automatico all'avvio invece che farlo prima della compilazione:

    File ResourceColorActivity.java
    codice:
    package it.apogeo.android.cap03.resourcecolor;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.LinearLayout;
    
    public class ResourceColorActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            LinearLayout l = (LinearLayout) findViewById(R.layout.main);
            int rosso_tra = getResources().getColor(R.color.red_transparent);
            l.setBackgroundColor(rosso_tra);
        }
    }
    File R.java
    codice:
    package it.apogeo.android.cap03.resourcecolor;
    
    public final class R {
        public static final class attr {
        }
        public static final class color {
            public static final int blue=0x7f040002;
            public static final int green=0x7f040001;
            public static final int red=0x7f040000;
            public static final int red_transparent=0x7f040003;
        }
        public static final class drawable {
            public static final int icon=0x7f020000;
        }
        public static final class layout {
            public static final int main=0x7f030000;
        }
        public static final class string {
            public static final int app_name=0x7f050001;
            public static final int hello=0x7f050000;
            public static final int label=0x7f050002;
        }
    }
    File colors.xml (specifica i colori)
    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <color name="red">#ff0000</color>
    <color name="green">#00ff00</color>
    <color name="blue">#0000ff</color>
    <color name="red_transparent">#66ddccdd</color>
    </resources>
    Il programma compila e parte ma all'avvio ottengo una schermata di errore intitoolata "Sorry" e che riporta questo messaggio:
    The application ResourceColor (process it.apogeo.android.cap03.resourcecolor) has stopped unexpectedly. Please try again.
    Ho scoperto che se commento la riga
    codice:
    l.setBackgroundColor(rosso_tra);
    nel file ResourceColorActivity.java l'errore scompare ma ovviamente l'applicazione non fa nulla.
    Qualcuno sa dirmi perchè si verifica questo errore?
    Uso Eclipse con ADT e un simulatore froyo (Android 2.2 - API Level 8).

  2.  
  3. #2
    Baby Droid


    Registrato dal
    Feb 2011
    Messaggi
    7

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Ok, ho fatto una ricerca approfondita su internet ed ho trovato una classe chiamata Inflater che serve per istanziare una oggetto a partire dal file xml nel quale è definito. A questo punto ho modificato il codice in questo modo:
    codice:
    package it.apogeo.android.cap03.resourcecolor;
    
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.view.LayoutInflater;
    
    public class ResourceColorActivity extends Activity {
    	LinearLayout l;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            LayoutInflater inflater = getLayoutInflater();
            l = (LinearLayout) inflater.inflate(R.layout.main,null); 
            int rosso_tra = getResources().getColor(R.color.red_transparent);
            l.setBackgroundColor(rosso_tra);
            setContentView(l);
        }
    }
    e tutto funziona.
    Mi chiedo una cosa: che differenza c'è tra questi due pezzi di codice?
    Codice che non funziona
    codice:
    l = (LinearLayout) findViewById(R.layout.main);
    l.setBackgroundColor(rosso_tra);
    Codice che funziona
    codice:
    LayoutInflater inflater = getLayoutInflater();
    l = (LinearLayout) inflater.inflate(R.layout.main,null);
    l.setBackgroundColor(rosso_tra);
    La findViewById() non ritorna l'istanza del LinearLayout visualizzato a schermo?

  4. #3
    Senior Droid


    Registrato dal
    Dec 2009
    Messaggi
    307

    Ringraziamenti
    15
    Ringraziato 40 volte in 39 Posts
    Predefinito

    Quote Originariamente inviato da redmarx Visualizza il messaggio
    Mi chiedo una cosa: che differenza c'è tra questi due pezzi di codice?
    Codice che non funziona
    codice:
    l = (LinearLayout) findViewById(R.layout.main);
    l.setBackgroundColor(rosso_tra);
    Codice che funziona
    codice:
    LayoutInflater inflater = getLayoutInflater();
    l = (LinearLayout) inflater.inflate(R.layout.main,null);
    l.setBackgroundColor(rosso_tra);
    La findViewById() non ritorna l'istanza del LinearLayout visualizzato a schermo?
    Sì, ti ritorna l'istanza del LinearLayout visualizzato a schermo se gli chiedi di restituirtela passando l'id giusto!
    Cioè normalmente crei un file di layout xml, lo piazzi nella directory giusta, chiami la setContentView passandogli l'id del layout

    e poi se vuoi recuperare un qualsiasi elemento della view (e solo dopo averla settata con la setContentView) chiami la findViewById

    e non come hai provato prima tu passando R.layout.main
    Spero di essere stato chiaro

    (o forse avevi chiamato main anche il linear layout ! in quel caso dovevi usare comunque R.id.main )

  5. Il seguente Utente ha ringraziato Orochi per il post:

    redmarx (10-02-11)

  6. #4
    Baby Droid


    Registrato dal
    Feb 2011
    Messaggi
    7

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da Orochi Visualizza il messaggio
    e non come hai provato prima tu passando R.layout.main
    Doh!
    Hai ragione. Mi sono confuso perchè quando eclipse genera un nuovo progetto non crea un id per il LinearLayout e quindi la classe R non ha un attributo R.id.main (si, il file si chiama main.xml).
    Ho dovuto assegnare a mano un attibuto id e quindi usarlo nella findViewById. Ora funziona, grazie infinite!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy