Em uma classe que peguei de exemplo do livro do Ricardo Lecheta há o código:
[code]public class ExemploCicloVidaAbrirTela extends ExemploCicloVida implements OnClickListener {
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Button b = new Button(this);
b.setText("Clique aqui para abrir a tela.");
b.setOnClickListener(this);
setContentView(b);
}
public void onClick(View v) {
Intent it = new Intent(this,Tela2.class);
it.putExtra("msg", "Olá");
startActivity(it);
}
}[/code]
que funciona direitinho, porém no meu projeto na linha 11 diz que o construtor não está definido
[code]public class Login extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_layout);
Button botao = (Button) findViewById(R.id.botao);
botao.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent it = new Intent(this, Home.class);
startActivity(it);
}
});
}
}[/code]
Gostaria de saber por que isso acontece. Desde já eu agradeço.
Numa vídeo-aula do Neri eu vi que ele fez usando o nome da classe antes do .this, ficaria assim
Mas então pq no codigo do Lecheta ele usou apenas this e deu certo?
Isso é conceito de Java.
Se você perceber, no caso de Lecheta a classe ExemploCicloVida implementa a interface responsável pelo click no botão, então ela é, além de o Contexto, também a interface.
Já no seu caso, você criou uma nova instancia de interface dando o ‘new’, ou seja, o this é referente a esta interface que não possui um Context, já que não é uma Activity.
Entendeu?
A classe que você enviou no exemplo (ExemploCicloVidaAbrirTela) instancia o Intent enviando no construtor o próprio objeto (this) e a classe específica para que o Intent funcione.
Esse construtor tem como parâmetros um Context e uma classe. O context que o exemplo enviou no this, além de implementar a interface OnClickListener, extende a classe ExemploCicloVida, que provavelmente é uma Activity. A classe Activity extende a classe ContextThemeWrapper, que por sua vez extende a classe ContextWrapper, que por sua vez extende a classe Context. Ou seja, utilizando o this na classe ExemploCicloVidaAbrirTela, esta classe é um tipo de Context.
Já no seu exemplo, você acaba utilizando um new OnClickListener, mudando o escopo de tudo que está dentro do OnClickListener, ou seja, enviando o this nesse caso, você está enviando um OnClickListener, e não a classe Login. O OnClickListener não extende a classe Context, por isso ele informa que o construtor não está definido, já que a classe Intent não possui o construtor: Intent(OnclickListener, class).
Melhorou?
Fica um pouco complicado de entender se você não entende um pouco de orientação a objetos e essa alteração de contexto em Java.
Cara… Perfeito. Entendi tudinho.
Se tivesse aqui eu te dava um beijo.
Use assim:
public class Login extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_layout);
Button botao = (Button) findViewById(R.id.botao);
botao.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent it = new Intent(Login.this, Home.class);
startActivity(it);
}
});
}
}
Galera eu to com problemas no mesmo trecho de código do lecheta. (The type ExemploCicloVidaAbrirTela must implement the inherited abstract method DialogInterface.OnClickListener.onClick(DialogInterface, int))
Na linha 1 ele pede para implementar os métodos não implementados, no caso seria o public void onClick() cuja assinatura ta diferente do livro do lecheta,
a assinatura do método da interface quer que fique assim public void onClick(DialogInterface dialog, int which) e o Lecheta diz para ficar como está a linha 11.
Outro problema é na linha 7 ele pede para fazer um cast para (android.view.View.OnClickListener) O Erro é esse : (The method setOnClickListener(View.OnClickListener) in the type View is not applicable for the arguments (ExemploCicloVidaAbrirTela))
O livro ta errado? O que eu to fazendo de errado?
[code]public class ExemploCicloVidaAbrirTela extends ExemploCicloVida implements OnClickListener {
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Button b = new Button(this);
b.setText("Clique aqui para abrir a tela.");
b.setOnClickListener(this);
setContentView(b);
}
public void onClick(View v) {
Intent it = new Intent(this,Tela2.class);
startActivity(it);
}
}[/code]
Galera, descobri, tinha escolhido os imports errados quando usei o recurso de adicionar os imports do eclipse.
Valeu, agora ta tudo funcionando.
Os imports eram assim
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
E ficaram assim
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;