Ajuda com startActivity()

9 respostas
Heartbreaker
Em uma classe que peguei de exemplo do livro do Ricardo Lecheta há o código:
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);
	}
}
que funciona direitinho, porém no meu projeto na linha 11 diz que o construtor não está definido
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);

			}
		});
	}

}
Gostaria de saber por que isso acontece. Desde já eu agradeço.

9 Respostas

Heartbreaker

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?

felipebonezi

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?

Heartbreaker

maaaaaaaais ou menus…

supermagro

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.

Heartbreaker

Cara… Perfeito. Entendi tudinho.
Se tivesse aqui eu te dava um beijo.

supermagro

Hehehe, menos, menos :stuck_out_tongue:

fabiofalci

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);

			}
		});
	}
}
V

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?

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);
	}
}
V

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;
Criado 23 de maio de 2012
Ultima resposta 20 de jun. de 2014
Respostas 9
Participantes 5