1 Activity e 2 Layouts - Não conseguindo chamar o segundo layout

Bom dia pessoal,

Dúvida simples mas muito difícil para quem está começando com Android. Procurei no histórico do forum e não encontrei a solução do problema.

Estou tendo problema aochamar um segundo layout em uma activity que já possui outro layout definido pelo setContentView.

Cenário:
AtividadeX + layout1 (campos de entrada para login e botão logar) + layout2(progressbar com mensagem).

Na tela de Login onde ocorre uma pequena demora ao validar o logon (normal). Queria exibir uma tela com o Progressbar só para não deixar a tela como travada até a conclusão dó processamento.

No evento onClick do botão logar - atividadeX, tenho setada pelo setContentView o layout1 e ocorre erro quando, durante o processamento, utilizo o setContentView para mostrar a tela enquanto processa.

Alguém pode me ajudar informando qual seria a melhor maneira de fazer isto?
Já li que é recomendado utilizar uma activity para cada Layout, mas como alterar ou utilizar isto?

Desde já agradeço.

procure sobre progressDialog, provavelmente tem exemplo no Android Developers.

Olá
Como o processo de validação é demorado o recomendado é fazer isso em outra Thread, a classe AsyncTask é ideal para isso.
A mensagem não precisa de outra activity, usa um ProgressDialog.
Veja um exemplo com os dois recursos: http://agorandroid.blogspot.com.br/2012/02/asynctask-e-progressdialog-ex03.html

É exatamente isso que o A H Gusukuma

Que interessante cara, às vezes agente precisa de um norte para poder dar andamento senão, acaba ficando perdido neste mundo de possibilidades…

Dei uma olha e estou tentando alguns testes.
Consegui executar o progressDialog.

Perguntas:
Por que é recomendado trabalhar com threads no android?
Quando utilizo o AsyncTask o processo fica mais rápido?

Obrigado pela força aí pessoal!

[quote=Kurt_Java]Que interessante cara, às vezes agente precisa de um norte para poder dar andamento senão, acaba ficando perdido neste mundo de possibilidades…

Dei uma olha e estou tentando alguns testes.
Consegui executar o progressDialog.

Perguntas:
Por que é recomendado trabalhar com threads no android?
Quando utilizo o AsyncTask o processo fica mais rápido?

Obrigado pela força aí pessoal![/quote]
Em relação à pergunta 1: devido à arquitetura dos app android, eles são baseados em thread única. Então não se deve bloquear essa thread, senão o app trava. E se passar de aprox. 5 segundos o android vai enviar uma mensagem de que o app não está respondendo.
Pergunta 2: Se estiver comparando com o uso de threads, não. Se for em relação ao uso de thread ou AsyncTask na app, sim. O app fica mais responsível ao usuário.

Não sei se no caso específico do login o uso de threads seria a melhor saída, pois de qualquer maneira o aplicativo precisa esperar o retorno do login antes de deixar o usuário prosseguir

Se este login for via webService, é melhor que tenha mesmo.

Boa noite pessoal, obrigado a todos.

Então, é login por webService.
Estou utilizando o tutorial do A H Gusukuma aí do post anterior para trabalhar com a thread, caí em um problema.
A exception é: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Estou fazendo a chamada do webService por um void, dentro do doInBackground (não sei se seria o melhor lugar para chamar o void) da thread.

protected String doInBackground(String… progress) {

                               int i = 1;
    	   String teste="nada";

                                  identificaLogon();

                            ...

    	  }  

Debugando vi que O Web Service retorna os dados ok com a thread, mas quando tento atualizar um componente, exemplo, txtNmPessoa, com a informação do processamento, dá exception se o executo no doInBackground.
Agora, se jogo esta parte de atualizar no onPostExecute, não dá o erro mas o progressBar dá uma travada, depois carrega as informações.

O que estou fazendo de errado? Resumidamente estou querendo chamar um void dentro de uma thread. Este Void busca informação de um webService e seta no componente gráfico…

Vlw, um abraço a todos =)

O erro é que você não pode atualizar a tela no doInBackground (roda em outra thread), usa os outros métodos para atualizar.

Entendi mas precisaria de tirar outra duvida.

Vi que este tipo de classe possui 3 métodos.
Qual seria mais recomendado para atualizar a tela?

No teste que fiz(implementando fora do dobackground a atualização da tela, após o processamento, a progressbar para e passa uma idéia de aplicação travada, enquanto atualiza.

Porque pelo que busquei de informação, a thread tem a finalidade de processamento, atualização não seria uma coisa que ela deveria realizar, mas, minha duvida seria onde agente atualizaria uma tela quando uma thread termina. No método da mesma ou fora dela?

poderia postar sua classe ?

Cláro…

Então, a parte da thread está com aquele erro descrito.
Aí está o que tem funcionado.

O problema é que quando trabalho com a AsyncTask, ao retirar a parte que atualiza o txtUser do doInBackground, não ocorre o erro informado mas a tela fica como travada até carregar.

O que seria recomendado para este caso?

package pkg.testeActivity ;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;

// Begin Async_Task

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.ProgressDialog;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

// End Async_Task

public class testeActivity extends Activity {
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    
    setContentView(R.layout.main);        
                       
    Button btnFechar = (Button) findViewById(R.id.btnFechar); 
    TextView txtUser = (TextView) findViewById(R.id.TxtUser);
                                       
    btnFechar.setOnClickListener(new View.OnClickListener() {        	        
		
		public void onClick(View v) {
			try {
								
				
				execTeste();
				
				
			} catch (Throwable e) {
				e.printStackTrace();
			}

		}
	});
           
                   
}//onCriated  -------------------------------------------------------------
       
    
public void execTeste(){


	ConvertService service = new ConvertService();
	String result = service.Convert("004982");    	
	   	
	Toast.makeText(MobileConsul01Activity.this, result, Toast.LENGTH_SHORT).show();
	    	
	    	
}



}    

}

public class ConvertService {

private static final String METHOD_NAME = "buscaPessoa";
private static final String NAMESPACE = "http://145.100.111.248/wsPessoa/";
private static final String SOAP_ACTION = "http://145.100.111.248/wsPessoa/buscaPessoa";
private static final String URL = "http://145.100.111.248/wsPessoa/wsPessoas.asmx";

String result = "";
	

public String Convert(String chapa) { 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
    request.addProperty("id", chapa);
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 
    
    try { 
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,9000); 
        androidHttpTransport.call(SOAP_ACTION, envelope); 
        
        if(envelope.getResponse()!=null){             
        	SoapPrimitive response = (SoapPrimitive) envelope.getResponse();             
        	result = response.toString();                     	
        } 
                    
        return result.toString(); 
    } catch (Exception e) { 
        return e.getMessage(); 
    } 
} 

}