[Android] Botão não está funcionando 2 vezes seguidas

Oi gente,

  1. Tenho um ImageButton com uma imagem;
  2. Ao clicar nesse ImageButton, aparece um Dialog perguntando se vc quer mudar a foto do contato(estou fazendo uma agenda eletrônica);
  3. Se vc clica “sim” no btn do Dialog, ele te leva ao gallery do celular, vc escolhe a imagem e logo em seguida a imagem aparece no mesmo ImageButton;

Problema: Se eu clicar no ImageButton novamente, sem fechar/abrir novamente a activity, para alterar novamente a imagem, ao clicar no btn “sim” do Dialog a gallery do celular não é chamada e eu não faço a mínima idéia do porque, já que nada aparece nem no LogCat, nem Console. Abaixo vai o código da activity:

package my.contacts;

import java.util.List;

import my.contacts.auxiliares.Contato;
import my.contacts.auxiliares.LerGravarExcluirScript;

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class DetalhesContato extends Activity {
		
	String nome;
	String dia;
	String mes;
	String email;	
	String fone;		
	String endereco;
	String cidade;	
	String pais;
	String imagem;
	
	int indice;
	int tamanhoList;
	
	TextView tNome;	
	TextView tFone;
	TextView aniversario;
	TextView aniversarioMes;
	TextView tEmail;	
	TextView tEndereco;
	TextView tCidade;
	TextView tEstado;
	TextView tPais;		
	
	ImageButton profilePictureButton;
	ImageButton ligarContato;
	
	List<Contato> contatos;
	Contato objContato;
	
	LerGravarExcluirScript acoesBancoDados;
	
	boolean threadDone = true;
	
	Dialog dialog;
	Dialog dialog2;
	
	public void onCreate(Bundle savedInstanceState) { 
		
        super.onCreate(savedInstanceState);
        setContentView(R.layout.detalhes_contato);
        
        Intent it = getIntent();
        
        nome = it.getStringExtra("nome");
        dia = it.getStringExtra("diaAniversario");
        mes = it.getStringExtra("mesAniversario");
        email = it.getStringExtra("email");		
		fone = it.getStringExtra("fone");
		endereco = it.getStringExtra("endereço");
		cidade = it.getStringExtra("cidade");		
		pais = it.getStringExtra("país");
		imagem = it.getStringExtra("imagem");
		indice = it.getIntExtra("indice", 0);
		
		tNome = (TextView) findViewById(R.id.nomeDisplay);
		tNome.setText(nome);		
		tFone = (TextView) findViewById(R.id.foneDisplay);
		tFone.setText(fone);				
		tEmail = (TextView) findViewById(R.id.emailDisplay);
		tEmail.setText(email);		
		tEndereco = (TextView) findViewById(R.id.enderecoDisplay);
		tEndereco.setText(endereco);
		tCidade = (TextView) findViewById(R.id.cidadeDisplay);
		tCidade.setText(cidade);		
		tPais = (TextView) findViewById(R.id.paisDisplay);
		tPais.setText(pais);
		
		profilePictureButton = (ImageButton) findViewById(R.id.profilePictureButton);
		profilePictureButton.setOnClickListener(new BotaoProfilePicture());
						
		ligarContato = (ImageButton) findViewById(R.id.callButton);
		ligarContato.setOnClickListener(new BotaoLigarContato());		
				
		Bitmap image = BitmapFactory.decodeFile(imagem);
		int h = 0;
	    int w = 0;
	    
	    try{	    
	        
			h = image.getHeight();
            w = image.getWidth();
            Bitmap imagePredimensionada = null;
            
            if(w > h) {
            	int int1 = (w - h)/2;
            	imagePredimensionada = Bitmap.createBitmap (image, int1, 0, h, h);            	
            }
			
			Drawable d = profilePictureButton.getDrawable();
    		int drawableAltura = d.getIntrinsicHeight ();
    		int drawableLargura = d.getIntrinsicWidth ();
    		Log.i("Contatos", "Altura drawable do ImageButton: " + drawableAltura + ", Largura drawable do ImageButton: " + drawableLargura);
			Bitmap scaledImagem = null;
			
			if(((drawableAltura == 150) || (drawableLargura == 150)) && imagePredimensionada == null) {
				scaledImagem = Bitmap.createScaledBitmap(image, 150, 150, true);
			}else if(((drawableAltura == 150) || (drawableLargura == 150)) && imagePredimensionada != null){
				scaledImagem = Bitmap.createScaledBitmap(imagePredimensionada, 150, 150, true);
			}else if(((drawableAltura == 112) || (drawableLargura == 112)) && imagePredimensionada == null) {
				scaledImagem = Bitmap.createScaledBitmap(image, 112, 112, true);
			}else if(((drawableAltura == 112) || (drawableLargura == 112)) && imagePredimensionada != null) {
				scaledImagem = Bitmap.createScaledBitmap(imagePredimensionada, 112, 112, true);
			}else if(((drawableAltura == 86) || (drawableLargura == 86)) && imagePredimensionada == null) {
				scaledImagem = Bitmap.createScaledBitmap(image, 86, 86, true);
			}else if(((drawableAltura == 86) || (drawableLargura == 86)) && imagePredimensionada != null) {
				scaledImagem = Bitmap.createScaledBitmap(imagePredimensionada, 86, 86, true);
			}
			profilePictureButton.setImageBitmap(scaledImagem);
			
	    }catch(NullPointerException e) {
	    	profilePictureButton.setImageResource(R.drawable.default_profile_picture);
		}				
		
	}		
			
	private class BotaoProfilePicture implements OnClickListener {

		public void onClick(View view) {
			
			//set up dialog
	        dialog2 = new Dialog(DetalhesContato.this);
	        dialog2.setContentView(R.layout.mudar_foto_dialog_layout);
	        dialog2.setTitle("   Mudar foto do contato");
	        dialog2.setCancelable(true);				         	        	        
	        
	        Button buttonSim = (Button) dialog2.findViewById(R.id.simBtn);
	        buttonSim.setOnClickListener(new BotaoSim2());
			
	        Button buttonNao = (Button) dialog2.findViewById(R.id.naoBtn);
	        buttonNao.setOnClickListener(new BotaoNao2());
	        				
			dialog2.show();
						
		}
		
	}
	
	protected class BotaoNao2 implements OnClickListener {

		public void onClick(View v) {
			dialog2.dismiss();			
		}
		
	}
	
	protected class BotaoSim2 implements OnClickListener {

		public void onClick(View v) {			
			dialog2.dismiss();																	
			Thread processoParalelo = new Thread(new MudarImagemContato());
			processoParalelo.start();									
		}
		
	}
	
	protected class MudarImagemContato implements Runnable {				
		public void run() {			
			if (threadDone) {				
				Intent it = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
				startActivityForResult(it, 1);										
			}						
		}		
	}
	
	protected void onActivityResult(int requestCode, int resultCode, Intent it) { 
	    super.onActivityResult(requestCode, resultCode, it); 

	    switch(requestCode) { 
	    case 1:
	        if(resultCode == RESULT_OK){
	        	//Linhas 185 a 195: recupera a imagem escolhida pelo usuário e a transforma em bitmap
	            Uri selectedImage = it.getData();
	            String[] filePathColumn = {MediaStore.Images.Media.DATA};

	            Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
	            cursor.moveToFirst();

	            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
	            String filePath = cursor.getString(columnIndex);
	            cursor.close();

	            Bitmap imagem = BitmapFactory.decodeFile(filePath);
	            int h = imagem.getHeight();
	            int w = imagem.getWidth();
	            Bitmap imagemPredimensionada = null;
	            
	            if(w > h) {
	            	int int1 = (w - h)/2;
	            	imagemPredimensionada = Bitmap.createBitmap (imagem, int1, 0, h, h);            	
	            }
	            
	            //Linhas 198 a 202: grava o endereço(filePath) da imagem do contato no banco de dados
	            acoesBancoDados = new LerGravarExcluirScript(DetalhesContato.this);			
	    		contatos = acoesBancoDados.listarContatos();			
	    		//Recupera o objeto Contato que foi clicado:
	    		objContato = contatos.get(indice);
	    		acoesBancoDados.salvarImagem(filePath, objContato);
	    		
	    		//Dimensionamento da imagem escolhida de acordo com o layout
	    		Drawable d = profilePictureButton.getDrawable();
	    		int drawableAltura = d.getIntrinsicHeight ();
	    		int drawableLargura = d.getIntrinsicWidth ();
	    		Log.i("Contatos", "Altura drawable do ImageButton: " + drawableAltura + ", Largura drawable do ImageButton: " + drawableLargura);
				Bitmap scaledImagem = null;
				
				if(((drawableAltura == 150) || (drawableLargura == 150)) && imagemPredimensionada == null) {
					scaledImagem = Bitmap.createScaledBitmap(imagem, 150, 150, true);
				}else if(((drawableAltura == 150) || (drawableLargura == 150)) && imagemPredimensionada != null){
					scaledImagem = Bitmap.createScaledBitmap(imagemPredimensionada, 150, 150, true);
				}else if(((drawableAltura == 112) || (drawableLargura == 112)) && imagemPredimensionada == null) {
					scaledImagem = Bitmap.createScaledBitmap(imagem, 112, 112, true);
				}else if(((drawableAltura == 112) || (drawableLargura == 112)) && imagemPredimensionada != null) {
					scaledImagem = Bitmap.createScaledBitmap(imagemPredimensionada, 112, 112, true);
				}else if(((drawableAltura == 86) || (drawableLargura == 86)) && imagemPredimensionada == null) {
					scaledImagem = Bitmap.createScaledBitmap(imagem, 86, 86, true);
				}else if(((drawableAltura == 86) || (drawableLargura == 86)) && imagemPredimensionada != null) {
					scaledImagem = Bitmap.createScaledBitmap(imagemPredimensionada, 86, 86, true);
				}
	    		
	    		profilePictureButton.setImageBitmap(scaledImagem);
	    		
	    		//Fecha o Banco de Dados
				acoesBancoDados.fechar();
				
	        }
	    }
	    threadDone = false;
	}
			
	private class BotaoLigarContato implements OnClickListener {

		public void onClick(View view) {
			Intent intencao = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:000000" + fone)); 
			startActivity(intencao);			
		}
		
	}
	
	public boolean onCreateOptionsMenu(Menu menu){   	
    	MenuInflater inflater = getMenuInflater();
    	inflater.inflate(R.menu.menu_detalhes_contato, menu);
    	return true;    	
    }
	
	public boolean onOptionsItemSelected(MenuItem item){
    	
    	switch(item.getItemId()){
    	
    	case R.id.editar_contato:
    		Intent it = new Intent (DetalhesContato.this, AlterarContato.class);			
			it.putExtra("nome", nome);
			it.putExtra("dia", dia);
			it.putExtra("mes", mes);
			it.putExtra("email", email);			
			it.putExtra("fone", fone);	
			it.putExtra("endereço", endereco);
			it.putExtra("cidade", cidade);			
			it.putExtra("país", pais);
			it.putExtra("imagem", imagem);
			it.putExtra("indice", indice);
			
			startActivity(it);
			finish();
    		return true;
    		
    	case R.id.apagar_contato:
    		//set up dialog
	        dialog = new Dialog(DetalhesContato.this);
	        dialog.setContentView(R.layout.apagar_contato_dialog_layout);
	        dialog.setTitle("   Excluir contato");
	        dialog.setCancelable(true);				       
	        
	        Button buttonSim = (Button) dialog.findViewById(R.id.simBtn);
	        buttonSim.setOnClickListener(new BotaoSim());
			
	        Button buttonNao = (Button) dialog.findViewById(R.id.naoBtn);
	        buttonNao.setOnClickListener(new BotaoNao());
	        				
			dialog.show();    		
    		return true;
    		
    	case R.id.voltar:
    		Intent intento = new Intent (DetalhesContato.this, ListarContatos.class);
			startActivity(intento);
			finish();    		
    		return true;
    		
    	default:   		
    		return false;
    	}
    }
							
	protected class BotaoNao implements OnClickListener {

		public void onClick(View v) {
			dialog.dismiss();			
		}
		
	}
	
	protected class BotaoSim implements OnClickListener {

		public void onClick(View v) {
			
			acoesBancoDados = new LerGravarExcluirScript(DetalhesContato.this);
			
			contatos = acoesBancoDados.listarContatos();
			
			//Recupera o objeto Contato que foi clicado:
			objContato = contatos.get(indice);
								
			Thread processoParalelo = new Thread(new RemoverContato());
			processoParalelo.start();
			chamaListaAtualizada();
			
		}
		
	}
			
	protected class RemoverContato implements Runnable {				
		public void run() {			
			if (threadDone) {
				acoesBancoDados = new LerGravarExcluirScript(DetalhesContato.this);
				acoesBancoDados.apagarContato(objContato);
				//Fecha o Banco de Dados
				acoesBancoDados.fechar();
				threadDone = false;				
			}						
		}		
	}
	
	protected void chamaListaAtualizada() {
		//Fecha o Banco de Dados
		acoesBancoDados.fechar();
		//Para não dar erro ao clicar no botão "sim" do Dialog
		dialog.dismiss();		
		Toast.makeText(DetalhesContato.this, "Contato apagado com sucesso!", Toast.LENGTH_LONG).show();
		Intent it = new Intent (this, ListarContatos.class);
		startActivity(it);
		finish();
	}
						
}

[Resolvido]

O que eu fiz:

  1. Embaixo da linha 179 coloquei: threadDone = true;
  2. Mudei a linha 62 para: boolean threadDone;

Já tentasse DEBUGAR??
Pode ser que tenha alguma falha de programação nos valores aonde o compilador não vai detectar o erro pois pra ele aquele valor está correto, o que pra você pode não estar.

Pelo o que eu li, por conta da sua linha 257, na segunda vez ela não inicializa a thread() porque precisa setar o threadDone para true.

Correto? :S

Pois foi exatamente isso, valeu felipe =]

De nada Nissivm! :slight_smile:
Quando terminar o projeto, da um feed back para eu ver?

Abraço,

Tá certo, pode deixar, abraços =]