Visualizzazione stampabile
-
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:
Quote:
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).
-
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?
-
Quote:
Originariamente inviato da
redmarx
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 roftl! in quel caso dovevi usare comunque R.id.main ;) )
-
Quote:
Originariamente inviato da
Orochi
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! ;)