Android: búsqueda del botón por id

Tengo un problema con la búsqueda de botones. Tengo un AlertDialog donde elijo uno de 5 opciones. Cuando elijo una opción, quiero cambiar el color del botón en el que hice clic. He declarado los botones en el archivo xml dentro de <RealativeLayout> pero cuando estoy tratando de encontrar mi botón por id (id son como "id1", "id2" …) utilizando el método findViewById , hay un error, que dice que No puedo usar este método como lo hago:

 AlertDialog.Builder builder = new AlertDialog.Builder(StartGameActivity.this); builder.setTitle(R.string.pickColor); builder.setItems(R.array.colorArray, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Button btn_tmp; String theButtonId = "id"; theButtonId = theButtonId+(String.valueOf(which)); btn_tmp = (Button) findViewById(theButtonId); } }); 

¿Cómo puedo solucionar eso o tal vez debería utilizar otro método?

EDITAR:

Creo que he resuelto mi problema. Utilicé uno de los métodos de Button: getId () así:

final int id = clickedButton.getId();

Final ImageButton btn_tmp; Btn_tmp = (ImageButton) findViewById (id);

Antecedentes: Los IDs son esencialmente variables

En los archivos XML damos IDs a los recursos, y luego los compiladores usan todos estos para generar gen/R.java . Así que esencialmente, estos IDs son variables int pertenecientes a la clase R. Un ejemplo de R.java:

 // btw this file should never be edited! public final class R { public static final class id { public static final int id1=0x7f0100aa; public static final int id2=0x7f0100ab; } } 

El hecho de que existe una String que contiene un nombre válido de una variable ( R.id.id1 ), no puede acceder mágicamente a esa variable. Para hacer esto, se puede usar la reflection . Sin embargo, en este caso creo que es una complicación innecesaria, e incluso será más lento .

findViewById necesita una ID (variable entera):

No puede suministrar un String a esta función. Debe utilizar un valor entero, y específicamente los que corresponden a int variables en R.java . Por ejemplo:

 findViewById(R.id.id1) // for your 1st button 

Solución:

Puede seleccionar dinámicamente el valor entero:

 AlertDialog.Builder builder = new AlertDialog.Builder(StartGameActivity.this); builder.setTitle(R.string.pickColor); builder.setItems(R.array.colorArray, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Button btn_tmp; int chosenID=-1; switch (which) { case 1: chosenID=R.id.id1; break; case 2: chosenID=R.id.id2; break; } btn_tmp = (Button) findViewById(chosenID); } }); 

También se sugiere utilizar más identificaciones explicativas, como: buttonDoThis , buttonDoThat .

 btn_tmp = (Button)findViewById(R.id.YourButtonId); 

Estás pasando cadena en lugar de entero.

Está intentando utilizar findViewById () con una cadena que contiene el nombre de la variable del ID. Java no admite este tipo de nombres de variables dinámicas ya que los nombres de las variables sólo se conocen en tiempo de compilación, no en tiempo de ejecución. ¿Que estás tratando de hacer? Usted tendrá que encontrar otra manera de resolver este problema. Por favor, explique más y podemos dar sugerencias.

Si está usando su propio layout.xml para el diálogo, primero debe inflarlo y darle la vista a su constructor de diálogo.

 LayoutInflater layoutInflater = (LayoutInflater) StartGameActivity.this.getSystemService( Context.LAYOUT_INFLATER_SERVICE); final RelativeLayout customDialogView= (RelativeLayout) layoutInflater.inflate(R.layout.custom_dialog_view, null); AlertDialog.Builder builder = new AlertDialog.Builder(StartGameActivity.this); builder.setTitle(R.string.pickColor); //give the custom view to your dialog builder. builder.setView(customDialogView); builder.setItems(R.array.colorArray, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Button btn_tmp; switch(which){ //....cases case 1: btn_tmp = (Button) customDialogView.findViewById(R.id.button1); //set the color of the button selected break; case 2: btn_tmp = (Button) customDialogView.findViewById(R.id.button2); //set the color of the button selected break; } //....cases } }); 
  • Botones sobre Mapview
  • Verificar orientación en el teléfono Android
  • Los caracteres árabes en String.Format ("% d", 1, Locale.US)
  • ¿Cómo puedo cargar mi propia clase Java en C en Android?
  • La variante actualmente seleccionada "arm-debug" utiliza APK divididos, pero ninguno de los 4 split-apks son compatibles con el dispositivo actual
  • Confundido acerca de la sincronización de varias tablas con el adaptador de sincronización y el proveedor de contenido
  • Comunicación de Android a node.js
  • Cómo registrar elemento HTML personalizado como widget en GWT
  • No se pudo leer la fila 0, col -1 de CursorWindow?
  • Android.os.NetworkOnMainThreadException usando rxjava en android
  • Cómo publicar un valor booleano o entero utilizando volley
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.