Ajuda com startActivity()

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?

maaaaaaaais ou menus…

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.

Hehehe, menos, menos :stuck_out_tongue:

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;