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?
- Error al usar un tarro en mi proyecto
- ¿Por qué no se prefieren los getters al acceder a variables entre actividades?
- LOG4J en Android
- Android Machine no está en la red
- Android cómo pasar un Activity.class como un argumento para una función
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);
- AudioTrack en modo de transmisión MODE_STREAMING
- Diferencia entre la biblioteca de Android y la biblioteca de Java en Android Studio
- Cómo usar el valor automático con firebase 9.2 en Android
- Problemas con NativeDecodeByteArray en Android Bitmap.class
- Problema con revelación circular y CircularRevealLibrary en Android
- ¿Cómo crear una función Java que una vez llamado, no se puede llamar de nuevo a menos que haya algún retraso?
- Hora de Joda y error de ProGuard al exportar .apk
- ¿Cuál es la mejor técnica de temporizador para intervalos exactos de un segundo?
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 } });
- Android: Cómo obtener eliminar margen / relleno en la pantalla de preferencias
- Medición de campaña con propio BroadcastReceiver