Inserir texto aleatório no botão? {Resolvido}

5 respostas
A

Boa tarde, tenho uma rotina que esta fazendo assim

botao1.setText(db.nome1); botao2.setText(db.nome4); botao3.setText(db.nome2); botao4.setText(db.nome3);

Queria saber se tem uma forma de ser preenchido aleatoriamente estes setText dos botões conforme as variáveis da classe db e não fixo como esta hoje.

Tipo assim uma hora fica assim

botao1.setText(db.nome3); botao2.setText(db.nome4); botao3.setText(db.nome2); botao4.setText(db.nome1);

outra assim?

botao1.setText(db.nome4); botao2.setText(db.nome3); botao3.setText(db.nome2); botao4.setText(db.nome1);

Outra vez assim

botao1.setText(db.nome2); botao2.setText(db.nome3); botao3.setText(db.nome1); botao4.setText(db.nome4);

Etc…

Como posso fazer ?

Obrigado.

5 Respostas

A
Estou tentando esta rotina aqui.
private void sorteioNome() {
        HashMap<Integer, String> hm = new HashMap<Integer, String>();
        hm.put(0, db.nome1);
        hm.put(1, db.nome2);
        hm.put(2, db.nome3);
        hm.put(3, db.nome4);

        Random gera1 = new Random();
        int ng1 = gera1.nextInt(4);
       
        Random gera2 = new Random();
        int ng2 = gera2.nextInt(3);
       
        Random gera3 = new Random();
        int ng3 = gera3.nextInt(2);
       
        Random gera4 = new Random();
        int ng4 = gera4.nextInt(1);
       
        botao1.setText(hm.get(ng1));
        botao2.setText(hm.get(ng2));
        botao3.setText(hm.get(ng3));
        botao4.setText(hm.get(ng4));
    }

Mais ai não da certo, repete muito os nomes, não queria que repetisse. Alguma sugestão?

Obrigado.

A

Não sei se ajudaria por ser código de outra linguagem, mais se fosse em pascal/delphi daria para ser feito desta forma

Exemplo:
procedure TForm3.Button1Click(Sender: TObject);
var
  Arr: array [1 .. 4] of String;
  i: Integer;
  procedure Swap(var A, B: String);
  var
    Temp: String;
  begin
    Temp := A;
    A := B;
    B := Temp;
  end;

begin
  Randomize;
  // popula o array
  Arr[1] := 'Maria';
  Arr[2] := 'João';
  Arr[3] := 'José';
  Arr[4] := 'Ana';
  // embaralha
  for i := Low(Arr) to High(Arr) do
    Swap(Arr[i], Arr[Random( High(Arr)) + 1]);
  // seta o caption dos botões
  Button1.Caption := Arr[1];
  Button2.Caption := Arr[2];
  Button3.Caption := Arr[3];
  Button4.Caption := Arr[4];
end;

Ja em java eu não sei montar e preciso montar esta rotina, alguém sabe como faço isso funcionar?

Obrigado.

A

Pessoal consegui resolver, meio meu estilo de programar em delphi, talvez seja gambiarra, mais pra mim funcionou, ja que não sei bem o java.

Como os valores vem de uma tabela fiz assim na classe DataBaseHelper, e aqui eu aplico o RANDOM direto na tabela.
public List<String> abrirImagemClienteBanco() {
		byte[] imagem = null;
		/** deixa todos os campos ja_gravados = N */
		updateClientes();
		/** cria uma lista de dados dos clientes */
		List<String> list = new ArrayList<String>();
		Cursor cursor = dbQuery.rawQuery(
				"SELECT * FROM clientes WHERE ja_utilizado <> \"S\" "
						+ " AND serie_cli = 1 ORDER BY RANDOM() limit 4 ",
				null);
		if (cursor.moveToFirst()) {
			cursor.moveToFirst();
			do {
				list.add(cursor.getString(1));
				/**Fazemos um updates deixando o campo = S*/
				updateClienteJafoi(cursor.getInt(0));
			} while (cursor.moveToNext());
		}
		if (cursor != null && !cursor.isClosed()) {
			cursor.close();
			/** aqui só mostra os que ja foi utilizado para capturar a foto */
			Cursor cs = dbQuery
					.rawQuery(
							"SELECT * FROM clientes WHERE ja_utilizado = \"S\" "
									+ " AND serie_cli = 1 ORDER BY RANDOM() limit 1 ",
							null);
			if (cs.getCount() > 0) {
				cs.moveToFirst();
				/** Captura imagem */
				imagem = cs
						.getBlob(cs.getColumnIndex("img_cliente"));
				/** Captura nome do cliente */
				nomeClienteSorteado = cs.getString(cs
						.getColumnIndex("nome_clliente"));
				/** Captura codigo do cliente */
				codigoCli = cs.getInt(cs.getColumnIndex("_id"));
			}

			cs.close();

			ByteArrayInputStream imageStream = new ByteArrayInputStream(imagem);
			theImage = BitmapFactory.decodeStream(imageStream);					
		}
		return list;
	}	

	public void updateClientes() {
		ContentValues values = new ContentValues();
		values.put("ja_utilizado", "N");
		dbQuery.update("clientes", values, null, null);
	}

	public void updateClienteJafoi(long codigo) {
		ContentValues values = new ContentValues();
		values.put("ja_utilizado", "S");
		dbQuery.update("clientes", values, "_id = ?",
				new String[] { codigo + "" });
	}
//********************************************* E na activity chamo o método assim
private void visualizarImagemClie() {
		/** imagem do banco de dados */
		imgMainCliente.setImageBitmap(db.theImage);
        /**limpo os botões a cada passada para o if	*/
		botao1.setText("");
		botao2.setText("");
		botao3.setText("");
		botao4.setText("");

		/** Lista todos os clientes */
		List<String> nomeClientes = db.abrirImagemClienteBanco();
		StringBuilder sb = new StringBuilder();
		sb.append("Clientes Sorteados:\n");
		for (String name : nomeClientes) {
			sb.append(name + "\n");
			/** Aqui um eninhado de if para popular com os nomes sorteados, no caso 4 nomes */
			if (botao1.getText().equals("")) {
				botao1.setText(name.toString());
			} else if (botao2.getText().equals("")) {
				botao2.setText(name.toString());
			} else if (botao3.getText().equals("")) {
				botao3.setText(name.toString());
			} else if (botao4.getText().equals("")) {
				botao4.setText(name.toString());
			}
		}
		//output.setText(sb.toString());
		// ImageView.
		imgMainCliente.setImageBitmap(db.theImage);
	}

Foi a forma que encontrei para conseguir fazer meu app funcionar, fica ai a dica caso alguém tenha a mesma duvida. Mais como disse não sou expert em java, por isso fiz desta maneira ai.

A

Desculpe dupliquei o post aqui, por isso apaguei.

Obrigado a todos.

Marky.Vasconcelos

No JavaSE eu associava nomes aos botoes e fazia 1-1 com identificadores para os campos dos objetos (variaveis) e carregava por magica com Reflection.

No Android eu normalmente tinha um método load() como o seu na Activity ou Fragment que representava o pedaço da tela.

Criado 19 de janeiro de 2014
Ultima resposta 27 de jan. de 2014
Respostas 5
Participantes 2