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

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.

Estou tentando esta rotina aqui.

[code]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));
}[/code]

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

Obrigado.

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:

[code]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;[/code]

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

Obrigado.

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.

[code]public List abrirImagemClienteBanco() {
byte[] imagem = null;
/** deixa todos os campos ja_gravados = N /
updateClientes();
/
* cria uma lista de dados dos clientes /
List list = new ArrayList();
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 + "" });
}[/code]


//*********************************************
E na activity chamo o método assim

[code]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);
}[/code]

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.

Desculpe dupliquei o post aqui, por isso apaguei.

Obrigado a todos.

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.