[RESOLVIDO]Chamar onActivityResult dentro de um Fragment

6 respostas
A

Pessoal, boa tarde.

Estou tentando fazer a chamada do onActivityResult() dentro de um Fragment e não estou conseguindo.

Eu tenho a seguinte estrutura:

FragmentActivity que chama um Fragment e neste Fragment eu tenho um botão que chama uma ListActivity, esta list por sinal retorna um objeto para o Fragment para exibi-lo em tela.

O código está dessa maneira:

Função do Fragment que chama a ListActivity:

private OnClickListener onConsultarTabelaPreco = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			try {
				
				Intent troca = new Intent(getActivity(), ListaTabelaPreco.class);
				startActivityForResult(troca, 1);
				
			} catch (Exception e) {
				// TODO: handle exception
				Toast.makeText(getActivity().getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
			}
		}
	};

ItemClick da ListActivity chamada:

@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		super.onListItemClick(l, v, position, id);
		
		Intent troca = new Intent(ListaTabelaPreco.this, CadastroClienteDados.class);
		TabelaPreco tabelaPreco = (TabelaPreco) this.getListAdapter().getItem(position);
		troca.putExtra("codigoTabelaPreco", tabelaPreco.getCodigo());
		setResult(RESULT_OK, troca);
		ListaTabelaPreco.this.finish();
	}

E ai estou tentando chamar o onActivityResult no Fragment, mas ele parece que não possui este método.

Alguém saberia como controlar o resultado de uma ListActivity desta forma que está estruturado?

Obrigado desde já.

6 Respostas

M

Voce vai ter que dar um getActivity().setResult

A

Olá
Você tem que implementar o método onActivityResult no fragment que chamou a activity. Você não chama o método, ele é chamado após o termino da activity.

A

Obrigado pela atenção
Desculpa pessoal, mas eu já havia tentado exatamente o que sugeriram.

Vamos lá:

Marky:
Você fala de no meu ListActivity dentro do ItemClick utilizar getActivity().setResult para devolver o código que preciso para o Fragment?
Porque na função ItemClick que eu copiei aqui, ela fica dentro do ListActivity e nem é disponível o getActivity() para utilizar o setResult...

A H Gusukuma:
Então eu implementei já o onActivityResult no Fragment, é eu me expressei errado. Não tenho que chamá-lo ele é chamado automático, entendo isso.
Mas o problema é que eu implemento ele e quando eu dou finish() na minha ListActivity e volto para o Fragment ele não passa no método onActivityResult como é de costume...

Quando eu implemento o onActivityResult no meu Fragment ele fica da seguinte maneira:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
		
		getActivity();
		if(requestCode==1){
	    	
	    	getActivity();
			if (resultCode==Activity.RESULT_OK){

				tabelaPreco = new TabelaPreco(data.getIntExtra("codigoTabelaPreco", 0));
				cliente.setTabelaPreco(tabelaPreco);
				edtTabelaPreco.setText(cliente.getTabelaPreco().getCodigo().toString() + " - " + cliente.getTabelaPreco().getDescricao().toString());
	    		
	    	} else {
				getActivity();
				if(resultCode == Activity.RESULT_CANCELED){
					
					Toast.makeText(getActivity().getBaseContext(), "Pesquisa Tabela Preço Cancelada!", Toast.LENGTH_LONG).show();
				}
			}
		 }
	};

Só que ele nem passa por este método.
Comparando com outros onActivityResult que já implementei, dentro de Activities é claro.

Eu até implemento o onActivityResult, mas ele não passa nele quando finalizo a ListActivity. Acredito que é por ser um Fragment.

Obrigado.

A

Obrigado pela atenção de todos.

Consegui resolver.

Ficou assim:

CadastroCliente (FragmentActivity) com ActionBar e Tabs.

Em cada Tab eu carrego 1 Fragment (CadastroClienteDados, CadastroClienteEntrega, CadastroClienteCobranca).

E no Fragment (CadastroClienteDados) eu tenho um botão que chama uma ListActivity (ListaTabelaPreco)

Essa lista me mostra vários itens, quando eu seleciono um. Eu preciso devolver o código selecionado para construir meu objeto TabelaPreco.

Então eu fiz da seguinte maneira, continuo chamando a ListActivity no meu Fragment:

private OnClickListener onConsultarTabelaPreco = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			try {
				
				Intent troca = new Intent(getActivity(), ListaTabelaPreco.class);
				getActivity().startActivityForResult(troca, 3);
				
			} catch (Exception e) {
				// TODO: handle exception
				Toast.makeText(getActivity().getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
			}
		}
	};
E devolvo o Item selecionado na minha ListActivity:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);

Intent troca = new Intent(ListaTabelaPreco.this, CadastroClienteDados.class);
TabelaPreco tabelaPreco = (TabelaPreco) this.getListAdapter().getItem(position);
troca.putExtra("codigoTabelaPreco", tabelaPreco.getCodigo());
setResult(RESULT_OK, troca);
ListaTabelaPreco.this.finish();
}

Só que acho que era marcação minha mesmo, porque desde o começo eu controlo as ações dos Fragments de modo hierárquico então o meu FragmentActivity cuida das ações e validações dos Fragments que ficam dentro de seus Tabs.
Então a única coisa que eu fiz, foi na chamada da ListActivity trocar:

startActivityForResult(troca, 3);
por
getActivity().startActivityForResult(troca, 3);

E então receber o retorno no onActivityResult da FragmentActivity:

if(resultCode==RESULT_OK){
				
				fragDados = (CadastroClienteDados) fm.findFragmentByTag("dados");
				fragDados.tabelaPreco = new TabelaPreco(data.getIntExtra("codigoTabelaPreco", 0));
				fragDados.cliente.setTabelaPreco(fragDados.tabelaPreco);
			
			}else if(resultCode==RESULT_CANCELED) {
				
				Toast.makeText(getBaseContext(), "Pesquisa Tabela Preço Cancelada!", Toast.LENGTH_LONG).show();
			}
Agora está funcionando corretamente.

Obrigado mesmo assim pela atenção de todos.

M

Por algum motivo, dando um startActivity de dentro do Fragment, ele retornava o result com us requestCodes bizarros.

A

Sim isso mesmo.
Eu testei aqui o requestCode estava com o valor 65138 ou algo do tipo.

Ai passando o getActivity() na chamada, funcionou.

Obrigado.

Criado 28 de fevereiro de 2013
Ultima resposta 1 de mar. de 2013
Respostas 6
Participantes 3