TabHost

Boa noite,

Alguém já usou o TabHost do Android? Fiz um projeto seguindo esse link:

http://devmobilebrasil.com.br/android/tab-widget-no-android/

Tem um main.xml, tela1.xml (é uma listview), tela2.xml (Tela de Cadastro). Como faço para voltar para o main quando estiver na tela2?

Código do botão Voltar que está na tela2.xml:

		voltar = (ImageButton) findViewById(R.id.btVoltar);
		voltar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//  Evento ao clicar no botão Voltar
				setResult(RESULT_CANCELED);
				setContentView(R.layout.main);
			}
		});

Uma coisa estranha que esta acontecendo é: Quando clico na Aba Clientes, chama normalmente a tela2, se clicar no botão voltar do emuladore, sai do programa. Se clico botão voltar que criei, a tela some ficando somente as abas e se clico novamente na AbaClientes, não aparece nada. Não sei o que está acontecendo.

Código que cria as Abas:

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		TabHost tbHost = getTabHost();
		TabHost.TabSpec Spec;
		Intent intent;

		intent = new Intent().setClass(this, AppTela1.class);
		Spec = tbHost.newTabSpec("tab1").setIndicator("Lista", getResources().getDrawable(R.drawable.lista))
				.setContent(intent);
		tbHost.addTab(Spec);

		intent = new Intent().setClass(this, AppTela2.class);
		Spec = tbHost.newTabSpec("tab2").setIndicator("Clientes", getResources().getDrawable(R.drawable.usuarios))
				.setContent(intent);
		tbHost.addTab(Spec);

		intent = new Intent().setClass(this, AppTela3.class);
		Spec = tbHost.newTabSpec("tab3").setIndicator("Veículos", getResources().getDrawable(R.drawable.veiculo))
				.setContent(intent);
		tbHost.addTab(Spec);

		tbHost.setCurrentTab(0);

	}

Por padrão o botão voltar do Android vai pra Activity anterior. Ou seja, se o teu programa tem somente uma activity com tabs internas, ao pressionar voltar ele realmente vai sair do programa.

Pra “corrigir” isso, você pode customizar o back button e mandar ele trocar de aba. Algo assim:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
      int currentTab = this.getTabHost().getCurrentTab();
      if (currentTab != 0) {
         this.getTabHost().setCurrentTab(currentTab - 1);
         return true;
      }
   }
   return super.onKeyDown(keyCode, event);
}

Obrigado pelo retorno. Eu coloco esse código na classe da tela onde ficam os botões ou onde cria as abas?

É na Activity mesmo, tu vai sobrescrever o método onKeyDown dela.

Onde eu crio o botão Voltar? Se for na Activity onde crio o botão, vai funcionar essa linha: getTabHost()? Porque onde crio as Tabs é em outro lugar.

Eu não vi seu código, mas possivelmente é na mesma classe que está o onCreate que tu postou no começo.

Eu crio as Tabs no onCreate mesmo. E como uso onde fica o botão Voltar da Tela?

O código que eu me referi anteriormente, é para o botão voltar que o Android já tem. Não é um adicional.

Se você quer ter um botão a mais, com o mesmo comportamento, basta criá-lo no onCreate. Ele pode ficar a baixo das tabs.

E como ficaria com um botão que eu criasse? E como utilizar?

wagnerfrancisco,

Como faz o lance do botão?

Aproveitando a deixa, queria saber também como pegar o id de um item na combobox, spinner. Eu preencho ela assim:

void carregaCombo(){
	   // Identifica o Spinner no layout
		  final Spinner comboClientes = (Spinner) findViewById(R.id.comboClientes);
		  final List<String> nomes = new ArrayList<String>();
	  //  final String nome;
			
		  mDb.open();	
		  Cursor clientes = mDb.getTodosClientes();
			
	      while (clientes.moveToNext()) {
            nomes.add(clientes.getString(clientes.getColumnIndex(DbAdapter.KEY_NOME)));
        	// nomes.add(clientes.getString(1));
          }
	      
	    //  Cria um ArrayAdapter usando um padrão de layout da classe R do android, 
	    //  passando o ArrayList nomes
			ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, nomes);
			ArrayAdapter<String> spinnerArrayAdapter = arrayAdapter;
			spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
			comboClientes.setAdapter(spinnerArrayAdapter);
	      
	      	clientes.close();
	}

Queria selecionar o nome no spinner e automaticamente mostrar o id dele.

Hum, você já tem o código do botão ali em cima, se o objetivo é apenas mudar a aba atual, basta:

voltar = (ImageButton) findViewById(R.id.btVoltar);
voltar.setOnClickListener(new View.OnClickListener() {
		
   @Override
   public void onClick(View v) {
   //  Evento ao clicar no botão Voltar
   int currentTab = this.getTabHost().getCurrentTab();
      if (currentTab != 0) {
         this.getTabHost().setCurrentTab(currentTab - 1);
      }
   }
});

Já que a função fica semelhante a que lhe passei anteriormente, sugiro que você encapsule o código que muda de aba numa função.

Como assim encapsule o código? Dá um help ai. Coloco isso na Activity do botão?

Botar ele numa função pra não precisar repetir o código 2 vezes. Mas isso é pra melhorar o teu código, primeiro pode fazer como postei.

Este código você vai substituir por aquele do botão voltar que você postou inicialmente.

Mas a tab está em outra Activity, que seria a Principal. Não vai dar erro se colocar na Activity CadastroCliente onde está o botão?

Vamos por partes. Pelo que eu entendi você quer um botão que volte as abas. É isto? Se for, acho que você deveria colocar o botão na tab principal (aí ele ficará visível em todas as abas).

Se não for isto, o que o botão exatamente deve fazer?

Ok, como o Jack? Quero que ao clicar no botão, voltar para a tela principal.

Exatamente. :lol:

Mas pelo que entendi o teu main.xml contém as abas (tela1.xml, tela2.xml). Ou seja, tudo que tu pode fazer é voltar para outra aba (da 2 para 1, por exemplo). Ou você tem mais uma activity principal além de todas essas?

Tem a Activity da tela de cadastro. Eu chamo na aba a tela, entendeu?

Principal:

public class TabWidgetActivity extends TabActivity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		TabHost tbHost = getTabHost();
		TabHost.TabSpec Spec;
		Intent intent;

		intent = new Intent().setClass(this, AppTela1.class);
		Spec = tbHost.newTabSpec("tab1").setIndicator("Lista", getResources().getDrawable(R.drawable.lista))
				.setContent(intent);
		tbHost.addTab(Spec);

		intent = new Intent().setClass(this, AppTela2.class);
		Spec = tbHost.newTabSpec("tab2").setIndicator("Clientes", getResources().getDrawable(R.drawable.usuarios))
				.setContent(intent);
		tbHost.addTab(Spec);

		intent = new Intent().setClass(this, AppTela3.class);
		Spec = tbHost.newTabSpec("tab3").setIndicator("Veículos", getResources().getDrawable(R.drawable.veiculo))
				.setContent(intent);
		tbHost.addTab(Spec);

		tbHost.setCurrentTab(0);

	}
}

AppTela2.class seria a tela de cadastro com o botão, entendeu?

Hum…

tela que contém as abas = main.xml (TabWidgetActivity)
tab1 = tela1.xml (AppTela1)
tab2 = tela2.xml (AppTela2)

Estando na tela2, você quer voltar pra tela1 ao clicar no botão voltar, certo? Neste caso, você precisa chamar, a partir da classe AppTela2, um método em TabWidgetActivity. Para isto, você precisa definir um método que faz isto dentro da classe TabWidgetActivity:

public void voltarTab(){
   int currentTab = this.getTabHost().getCurrentTab();
   if (currentTab != 0) {
      this.getTabHost().setCurrentTab(currentTab - 1);
   }
}

Dentro da classe AppTela2, você precisa chamar este método:

voltar = (ImageButton) findViewById(R.id.btVoltar);
voltar.setOnClickListener(new View.OnClickListener() {
			
   @Override
   public void onClick(View v) {
      TabWidgetActivity parent = (TabWidgetActivity) getParent();
      parent.voltarTab();
   }
});