Autore Topic: Utilizzo delle proprietà  (Letto 1327 volte)

Offline HyBriiD

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG-Optimus
  • Sistema operativo:
    Ubuntu 10.10 - Windows 7, XP
Utilizzo delle proprietà
« il: 18 Giugno 2011, 22:16:07 CEST »
0
Salve ragazzi, avrei una domanda... ho cominciato a cimentarmi da poco al codice scritto per realizzare applicazioni android (causa studio per scuola, e ci hanno massacrato negli ultimi mesi ;-) ) comunque ho visto un po di tutorial e all'interno della classe Activity vengono creati oggetti come pulsanti ecc.. Quello che sostanzialmente mi preme e che vedendo i codici dei vari programmatori non vedo mai delle proprietà (almeno dove ho visto io ), faccio un esempio:

Codice (Java): [Seleziona]
public class MiaAttivita extends Activity{
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

Button cmdCiao = new Button(this);
this.setContentView(cmdCiao);
}

mentre io sono abituato per creare un oggetto a fare in java tradizionale
Codice (Java): [Seleziona]
public class MiaAttivita extends Activity{

private Button cmdCiao = new Button(this);

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


this.setContentView(cmdCiao);
}


la domanda è, devo continuare a dichiarare proprietà nell'ultimo modo oppure c'è una ragione per cui non ho mai visto (magari mi sbaglio) utilizzare l'ultimo caso???

grz dell'attenzione!!!! :D

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Utilizzo delle proprietà
« Risposta #1 il: 19 Giugno 2011, 08:53:58 CEST »
+1
Probabilmente non si vede spesso in giro neanche il primo caso che hai segnalato... :)

Nella stragrande maggioranza dei casi ci si trova a lavorare con dei layout costruiti in via dichiarativa tramite XML, i quali vengono poi assegnati ad una activity tramite il metodo setContentView(int resId). I relativi elementi del layout (i pulsanti, le caselle di testo, le checkbox ecc ecc) vengono poi "prelevati" dal layout tramite chiamate al metodo findViewById(int resId).

In questo modo si scinde quella che è la struttura logica dell'applicazione dalla sua rappresentazione grafica, con sommo sollievo dei team di sviluppo dove (spesso) i designers grafici non capiscono una cippa di programmazione e viceversa i coders a stento riescono a disegnare un alberello stilizzato su foglio di carta. :D

PS
Faccio parte della categoria succitata di coders :P
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline HyBriiD

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG-Optimus
  • Sistema operativo:
    Ubuntu 10.10 - Windows 7, XP
Re:Utilizzo delle proprietà
« Risposta #2 il: 19 Giugno 2011, 14:40:24 CEST »
0
aaaahhh vero... però sto seguendo dei tutorial e infatti dopo dice che utilizzare le ViewGroup con altri oggetti e aggiungerli ogni volta al layout che si usa è svantaggioso in quanto poco leggibile... ok grz per la risposta tempestiva  :-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Utilizzo delle proprietà
« Risposta #3 il: 19 Giugno 2011, 14:50:16 CEST »
0
aaaahhh vero... però sto seguendo dei tutorial e infatti dopo dice che utilizzare le ViewGroup con altri oggetti e aggiungerli ogni volta al layout che si usa è svantaggioso in quanto poco leggibile... ok grz per la risposta tempestiva  :-)

Ci sono tutorial anche sul sito ufficiale android, io ho iniziato da quelli ed è stato tutto molto semplice.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline HyBriiD

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG-Optimus
  • Sistema operativo:
    Ubuntu 10.10 - Windows 7, XP
Re:Utilizzo delle proprietà
« Risposta #4 il: 20 Giugno 2011, 10:16:30 CEST »
0
volevo segnalare solo una cosa: se si utilizza questa sintassi

 
Codice (Java): [Seleziona]
public class MiaAttivita extends Activity{

private Button cmdCiao = new Button(this);

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


this.setContentView(cmdCiao);
}

l'emulatore restituisce un errore cioè dice che l'applicazione si blocca inaspettatamente, se poi provo a dichiarare il pulsante all'interno del metodo onCreate l'applicazione funziona alla perfezione... non ho ben capito il perchè.. qualcuno mi sa dare una risposta? è un problema riguardante il ciclo dell'attività?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Utilizzo delle proprietà
« Risposta #5 il: 20 Giugno 2011, 10:36:28 CEST »
+1
No, il problema consiste nel fatto che hai qualche lacuna in java.

Stai utilizzando l'operatore this in un ambiente statico.

Offline HyBriiD

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG-Optimus
  • Sistema operativo:
    Ubuntu 10.10 - Windows 7, XP
Re:Utilizzo delle proprietà
« Risposta #6 il: 20 Giugno 2011, 11:13:28 CEST »
0
il this non si deve passare perchè gli oggetti estendono indirettamente Context? se è cosi cosa devo passare? oppure ti riferisci al this.setContentView? ho provato a togliere quel this ma mi da lo stesso errore...

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Utilizzo delle proprietà
« Risposta #7 il: 20 Giugno 2011, 11:17:50 CEST »
0
Mi riferisco al fatto che non puoi utilizzare this nella parte dichiarativa del codice. L'assegnazione con this puoi farla solo all'interno di un metodo dell'oggetto instanziato.

Offline HyBriiD

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG-Optimus
  • Sistema operativo:
    Ubuntu 10.10 - Windows 7, XP
Re:Utilizzo delle proprietà
« Risposta #8 il: 20 Giugno 2011, 11:29:07 CEST »
0
non mi era ancora capitata una cosa simile (il this all'interno del costruttore per me è nuovo ;-) ma sbagliando si impara)... comunque ho capito e risolto, grazie per l'aiuto  ;-)

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Utilizzo delle proprietà
« Risposta #9 il: 20 Giugno 2011, 11:35:29 CEST »
+1
Apparentemente è un codice Java corretto (this si può utilizzare in quel modo, infatti il compilatore Java non segnala errore) ma Android gestiste in modo particolare e esternamente dalla VM gli oggetti grafici in base al Contest, se un oggetto viene creato nel momento in cui il Contest non è quello corretto può succedere quello che hai descritto.

Una trattazione più approfondita:

initialization - Why does not this work - Android - onCreate() - Stack Overflow
adb logcat | tee /tmp/logcat | grep TAG

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Utilizzo delle proprietà
« Risposta #10 il: 20 Giugno 2011, 11:43:56 CEST »
+1
no.
Quello che ha detto Marco è corretto.

Questo problema prescinde dal fatto che si stia utilizzando un oggetto grafico o meno.
Se utilizzi una tua qualunque classe che prende un Context come parametro, e la inizializzi prima che venga istanziata la classe stessa, non avrai nessun Context, perché stai utilizzando l'operatore this in un contesto statico, proprio come ha detto Marco.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Utilizzo delle proprietà
« Risposta #11 il: 20 Giugno 2011, 12:26:10 CEST »
0
Tecnicamente è più corretto quello che dice iceweasel (non sei in uno static se non la definisci come static, cosa che avevo capito in modo erroneo io).
In quel punto non è stato ancora creato il Context e quindi si ha il problema a runtime.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Utilizzo delle proprietà
« Risposta #12 il: 20 Giugno 2011, 12:52:42 CEST »
0
Tecnicamente quello che ha detto iceweasel non credo sia corretto, perché fa riferimento unicamente agli oggetti grafici legati al contest mentre è un comportamento standard, quindi prescinde dal tutto.
Mi sono accodato a te perché parlare di contesto statico mi va bene in quanto è presente a prescindere che venga o meno creata un'istanza della classe.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Utilizzo delle proprietà
« Risposta #13 il: 20 Giugno 2011, 13:39:15 CEST »
0
Allora, riordiniamo le idee e vediamo cosa c'è di giusto e di sbagliato.

Sotto un punto di vista di programmazione java la dichiarazione
Codice (Java): [Seleziona]
private Button cmdCiao = new Button(this);fatta a livello di variabile membro di una classe non è errata e non ha errori in fase di compilazione.

L'errore in fase di compilazione avviene nel momento in cui il costruttore di Button cerca alcune proprietà del Context (passato tramite il this) che non sono state ancora impostate. Il Context, infatti, viene creato dal framework Android dopo la costruzione dell'oggetto Activity e prima di richiamarne il relativo metodo onCreate (non è quindi la VM che effettua questa operazione ma il processo di creazione di una attività del framework).

Un oggetto grafico ha sempre bisogno di un Context valido per essere definito, quindi non è possibile crearlo tramite una dichiarazione come quella di sopra.

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Utilizzo delle proprietà
« Risposta #14 il: 20 Giugno 2011, 20:04:25 CEST »
0
Allora, riordiniamo le idee e vediamo cosa c'è di giusto e di sbagliato.

Sotto un punto di vista di programmazione java la dichiarazione
Codice (Java): [Seleziona]
private Button cmdCiao = new Button(this);fatta a livello di variabile membro di una classe non è errata e non ha errori in fase di compilazione.

[...]

MarcoDuff credo che thebugger abbia ragione. Quel "this" non può essere localizzato lì per un semplice motivo: nella creazione dell'oggetto vengono PRIMA istanziate le variabili membro (che siano null o con operatore new non importa) e POI viene richiamato il costruttore (default o personalizzato), di conseguenza THIS, in questo caso specifico (e se il compilatore non da alcun errore di compilazione) è paradossalmente equivalente a NULL in quanto non è stato ancora assegnato un riferimento per l'allocazione in memoria.
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker