Visualizzazione stampabile
-
Problema con Java
Ciao a tutti, premetto che ho qualche conoscenza di java ma non troppo avanzata e sto studiando da un paio di giorni la programmazione per android da l libro di Massimo Carli.
Forse più avanti il libro spiegherà meglio questa parte, intanto preferirei capire la sintassi visto che non l'ho mai usata in java:
codice:
pressButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
outputView.setText("Click # " + counter++);
}
});
Scusate l'ignoranza, ma non saprei come approfondire il concetto perchè non so come viene chiamato questo "paradigma"
Ciao a tutti e grazie per l'attenzione
-
in poche parole non fai altro con questo codice che settare un listener sul tuo button che si preoccupa di gestire la pressione del tuo button attraverso il metodo onClick(View v), nel tuo caso specifico alla pressione del button non fai altro che settare il testo di una textView.
fammi sapere se hai bisogno di altre delucidazioni
-
Ciao e grazie per la tua disponibilità :)
In realtà non mi sono spiegato molto bene... il compito del programma, cioè quello di settare un listener sul pulsante ed eseguire l'azione, l'ho capito.
Quello che non ho capito è il compito della new all'interno delle parentesi tonde...
cioè, vorrei capire meglio cosa succede a livello di riferimenti, parametri ecc..
Nella mia scarsa esperienza con Java, non mi era mai capitato di vedere una cosa del tipo:
metodo1( new metodo2{ ... } );
E ho preferito pormi qualche domanda su java prima di continuare a leggere dando per scontata questa sintassi.
-
in poche parole il new serve ad istanziare un nuovo listener sarebbe lo stesso se istanziassi prima il listener ad esempio così
codice:
OnClickListener clickListener=new OnClickListener(){ public void onClick(View v){ ...} }
e poi lo passi come parametro al metodo setOnClickListener(clickListener) così
oppure potresti far si che la tua classe implementi OnClickListener e passare this come riferimento al metodo setOnClickListener(this) in questa maniera
non so se sono stato esauriente ma non credo ci sia di più da dire fammi sapere
-
Sei stato chiarissimo!
Ti faccio un'altra domanda così mi tolgo ogni dubbio (spero)...
Io ho sempre usato la new in questo modo:
codice:
new Oggetto( eventuali parametri per il costruttore);
Perchè invece, in questo caso, dopo le parentesi tonde si usano le graffe come se si volesse definire il metodo?
codice:
new Oggetto( eventuali parametri per il costruttore){
istruzioni
}
;
-
proprio perchè inizialmente vai ad instanziare l'interfaccia del listener con new onClickListener e dopo le parentesi graffe tu vai ad implementare il metodo onClick();
-
Quote:
Originariamente inviato da
blaster
proprio perchè inizialmente vai ad instanziare l'interfaccia del listener con new onClickListener e dopo le parentesi graffe tu vai ad implementare il metodo onClick();
Ora ho un pò di confusione o_O
Che io sappia, un'interfaccia ha proprio la caratteristica che non può essere instanziata...
A parte questo, vediamo se ho capito:
fare
codice:
new Interfaccia(){
void metodo1(){
...
}}
significa instanziare un'oggetto di Interfaccia che avrà un unico metodo implementato (cioè metodo1) e tutti gli altri astratti?
-
Quote:
Originariamente inviato da
Supergiox
Ora ho un pò di confusione o_O
Che io sappia, un'interfaccia ha proprio la caratteristica che non può essere instanziata...
A parte questo, vediamo se ho capito:
fare
codice:
new Interfaccia(){
void metodo1(){
...
}}
significa instanziare un'oggetto di Interfaccia che avrà un unico metodo implementato (cioè metodo1) e tutti gli altri astratti?
Più precisamente con quella sintassi dichiari una classe anonima che implementa quella interfaccia ;)
-
Perfetto!
Mi hai fatto capire qual era la mia lacuna... le CLASSI ANONIME! :)
Mai viste prima... ho letto qualcosa e ho capito!
Grazie!
-
Invece (non so se è il caso di aprire un altro post),
vorrei capire perchè si utilizza la parola chiave "final" per la TextView, se proprio questa verrà modificata (fatto sta che il programma funziona!), e invece il button non è final...
codice:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ProjectLayoutActivity extends Activity {
// COntatore
private int counter = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Otteniamo il riferimento al Button
Button pressButton = (Button) findViewById(R.id.pressButton);
// Otteniamo il riferimento alla TextView
final TextView outputView = (TextView) findViewById(R.id.output);
// Ascoltiamo l'evento di pressione associato al pulsante
pressButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
outputView.setText("Click # " + counter++);
}
});
}
}
E poi non so a cosa serve l'istruzione @override.
La cosa grave è che non trovo risposta alle mie domande sui libri...
-
Quote:
Originariamente inviato da
Supergiox
Invece (non so se è il caso di aprire un altro post),
vorrei capire perchè si utilizza la parola chiave "final" per la TextView, se proprio questa verrà modificata (fatto sta che il programma funziona!), e invece il button non è final...
E poi non so a cosa serve l'istruzione @override.
La cosa grave è che non trovo risposta alle mie domande sui libri...
Ma guarda, sui final rimango un pochino perplesso anch'io, visto che quando programma in quel senso non li uso mai. La clausola final definisce in pratica una costante... è ben vero che una volta riempita con la relativa view non verrà mai cambiata, ma comunque trattandosi di una variabile non mi sembra proprio un uso rigoroso.
Ah, in realtà nel codice che hai esposto il TextView non viene modificato in modo che possa interessare all'attributo final. Trattandosi di una classe modificarlo violando la clausola final significherebbe assegnargli un altro puntatore di memoria che conserva i dati di quella classe. Invocare un metodo della classe, anche se modifica gli attributi, non modifica "l'area" di memoria in cui questi verranno scritti quindi non modifica il suo riferimento che è la TextView.
Ecco, come tutte le volte che mi metto a parlare di puntatori mi è venuto il vomitino... :-$
Override è solo un'annotazione, quindi facoltativa. Indica che il metodo che stai andando a scrivere è in realtà una riscrittura di un metodo già presente nella classe che stai estendendo, in particolare il metodo onCreate().
In pratica Activity ha già un suo onCreate (che puoi vedere nel javadoc), tu però lo riscrivi perché la classe che stai facendo ProjectLayoutActivity ha bisogno di un'implementazione diversa.
In questo caso particolare è una procedura standard nella scrittura di un'Activity android, in realtà può essere usata in diversi modi.
Volendo ci starebbe bene un override pure sopra
public void onClick(View v)
-
Anche a me non piacciono troppo i puntatori... e anzi in Java si usano meno che in C per fortuna :P Però bisogna ammettere che sono importanti perchè aiutano a capire il funzionamento interno...
Comunque se è come dici tu, cioè che un'oggetto final consente di modificarne gli attributi, va bene! é un pò meno chiara la scelta di usarlo da parte dell'autore, e la scelta di non usarlo in button... ma per ora va bene così! ;)
-
Quote:
Originariamente inviato da
Supergiox
Anche a me non piacciono troppo i puntatori... e anzi in Java si usano meno che in C per fortuna
Dai, concedimi di pignolare :p
In JAVA si usano come in C, però JAVA si occupa da solo di gestirli lasciando il programmatore un po' più tranquillo :p
-
Quote:
Originariamente inviato da
Cymon
Dai, concedimi di pignolare :p
In JAVA si usano come in C, però JAVA si occupa da solo di gestirli lasciando il programmatore un po' più tranquillo :p
Giusto! E se devo essere sincero mi aspettavo che qualcuno lo dicesse xD
-
ciao!!!Io sono al tuo stesso punto e sul
pressButton.setOnClickListener(new OnClickListener() {
mi da errore su OnClickListener()...Sai come mai? :S
https://www.androidiani.com/forum/le...klistener.html
-
Quote:
Originariamente inviato da
Ferri
Ad occhio manca la classe tra gli import...
-
package it.apogeo.cap03.resurcelayout;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ResurceLayoutActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button pressButton = (Button) findViewById(R.id.pressButton);
final TextView outputView = (TextView) findViewById(R.id.output);
pressButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int counter = 0;
outputView.setText("Click # " + counter ++ );
}
});
}
}
Inserendola, queste sono le modifice aggiuntive che ho dovuto apportare! Ma il run comuque mi dice che che il mio project contiene errori. L esempio è a pag 65. Crisi nera :-X:-X:-X:-X:-X
-
Quote:
Originariamente inviato da
Ferri
package it.apogeo.cap03.resurcelayout;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ResurceLayoutActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button pressButton = (Button) findViewById(R.id.pressButton);
final TextView outputView = (TextView) findViewById(R.id.output);
pressButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int counter = 0;
outputView.setText("Click # " + counter ++ );
}
});
}
}
Inserendola, queste sono le modifice aggiuntive che ho dovuto apportare! Ma il run comuque mi dice che che il mio project contiene errori. L esempio è a pag 65. Crisi nera :-X:-X:-X:-X:-X
Mi sembra di vedere uno spazio tra counter e ++, ma se ci dicessi che errosi sono sarebbe più facile...
Ribadisco che prima di buttarsi a pesce s android sarebbe caldamente consigliato farsi un po' le ossa sul java... ;)
-
Lo spazio non c'è, bug grafico! :)
Comuque hai ragione ma pensavo che questa guida illustrasse passo passo le operazioni, ma evidentemente mi trovo in difficoltà, anche perchè ho copiato pari pari il code e non vedo perchè dovrebbe darmi quell errore.
:-X
tu quella pagina come l hai passata?
-
Quote:
Originariamente inviato da
Ferri
Lo spazio non c'è, bug grafico! :)
Comuque hai ragione ma pensavo che questa guida illustrasse passo passo le operazioni, ma evidentemente mi trovo in difficoltà, anche perchè ho copiato pari pari il code e non vedo perchè dovrebbe darmi quell errore.
:-X
tu quella pagina come l hai passata?
Non ho usato il libbbbro ;)
Comunque il discorso è che la guida android (e molte guide android) danno java per scontato. E comunque (questo vale per TUTTI i testi di informatica da Turing* in poi) non ci si può mai fidare ciecamente di un listato stampato e sperare che non dia noie in compilazione.
In generale quando il codice si inceppa si tratta sempre di sciocchezze che uno sviluppatore java anche con pochi mesi di esperienza supera a pié pari e ignora, anche perché non riguardano quello che sta studiando.
Se però si accavallano le ovvie perplessità di android con le ovvie perplessità di java essendo entrambe cose nuove si va in cortocircuito.
In ogni caso non hai ancora detto che errore ti da :)
*Si, anche i testi di Turing. Ma lui faceva il figo perché nessuno aveva ancora trovato una macchina con nastri infiniti su cui compilare la sua roba**
**Roba tra cui c'era una versione preliminare di tetris, sembra. Ma i russi ti uccidono se lo dici in giro.
-
Maledetti russi! roftl
Mi consigli un manuale semplice semplice di java?Quì è un macello anche con gli array, ma non si può demordere..VANTI TUTTA! :O
mi dice che cè un errore in OnClickListener, sottolineato in rosso "cannot be resolved to a type" e mi da 4 possibilità di fix!
Ho provato a "Crate Class" che mi crea un file con l evento onclik del bottone ma il libro non riporta nulla del genre e cme non saprei cosa mettere in quell evento se non la public void onClick(View v) che segue quest istruzione.
ODDIOOOOO
GRAZIE INFINITE PER LA DISPONIBILITà
-
Quote:
Originariamente inviato da
Ferri
Maledetti russi! roftl
Mi consigli un manuale semplice semplice di java?Quì è un macello anche con gli array, ma non si può demordere..VANTI TUTTA! :O
mi dice che cè un errore in OnClickListener, sottolineato in rosso "cannot be resolved to a type" e mi da 4 possibilità di fix!
Ho provato a "Crate Class" che mi crea un file con l evento onclik del bottone ma il libro non riporta nulla del genre e cme non saprei cosa mettere in quell evento se non la public void onClick(View v) che segue quest istruzione.
ODDIOOOOO
GRAZIE INFINITE PER LA DISPONIBILITà
Ho avuto un deja-vu o_O
Quindi o matrix sta cambiando la realtà (:cool:) o qualcosa dal mio passato mi sta chiamando (:-[) o sono diventato completamente scemo (:-$)
E invece no... ecco il tuo problema risolto dall'autore del libro in persona.
Per quello che riguarda Java ho sentito dire che ancor oggi il JAVA mattone su mattone è un buon testo. Per qualcosa di più rapido puoi cercare a berti il tutorial su HTML.it.
Ovviamente tutto ciò non basta, ma aiuta. ;)
-
GRANDE GRANDE GRANDEEEE!!!Ma non c ho capito un cazzo...! o_O :-X :-X :-X :-X
quando dice il sito di apogeo a cosa si riferisce?!?!e listati da dove si scaricano!?Perchè tutto sto sminuzzamento in informazioni perchèè
:-X
-
Listati trovati..GRAZIE A DIO