2010-09-27 9 views
7

Tengo un diseño xml que mostrará una cuadrícula formada por textviews dentro de las tablas. Los nombres de la vista de texto son cell00, cell01, etc. En el tiempo de ejecución, mi programa determinará qué celda debe cambiarse.Cómo crear findViewById parm dinámicamente o mediante programación en tiempo de ejecución

¿Hay alguna manera de darle un nombre al formato para que pueda pasarlo al método findViewById en el tiempo de ejecución? Por ejemplo, si se necesita cell00, ¿cómo puedo generar el parm en este código?

TextView currcell = (TextView) findViewById(R.id.cell00) 

Algo así como “célula” 00 no se compila porque el método findViewById no acepta un tipo de cadena. No quiero tener todos los nombres de la vista de texto en la grilla codificados en el programa, debe haber una mejor manera.

Gracias por cualquier ayuda que pueda proporcionar.

+0

solo curiosidad por lo que está tratando de lograr utilizando una vista de tabla sobre una vista de cuadrícula? – schwiz

+0

Esta sencilla aplicación de primera vez mostrará una solución de crucigramas. La única forma en que sé cómo hacer la grilla es con textviews dentro de las tablas. La vista de texto me permite ingresar datos en cada celda e incluso usar HTML para obtener ciertas características. Traté de averiguar cómo se hacen las grillas de crucigramas profesionales, pero finalmente acepté la derrota y me rendí. Estoy seguro de que otros usan un método mejor que el mío. Realmente me gustaría saber cómo hacer una plantilla de cuadrícula realmente bonita. – greenset

+0

@schwiz Una razón para usar un diseño de tabla en lugar de una vista de cuadrícula es si necesita un número particular de elementos en cada fila. Una vista de cuadrícula simplemente envuelve el contenido al final de cada fila, por lo que el número en una fila variará en función del tamaño de la pantalla, etc. –

Respuesta

4

Puede usar la reflexión para encontrar el valor entero de una variable con nombre en R.id.

Class clazz = R.id.class; 
Field f = clazz.getField("cell" + "00"); 
int id = f.getInt(null); // pass in null, since field is a static field. 
TextView currcell = (TextView) findViewById(id); 

Tenga en cuenta que la reflexión puede ser lenta. Si lo haces mucho, es posible que desees guardar valores en caché o idear una forma diferente.

+0

Muy útil. Realmente aprecio tu tiempo. Ingresé el código y obtuve una compilación limpia. Debería haber venido a este sitio hace semanas. – greenset

3
int id = getResources().getIdentifier("cell00", "id", getPackageName()); 
TextView currcell = (TextView) findViewById(id); 

Al igual que Mayra's way, el código también utiliza la reflexión, así que ten cuidado.

+0

Ty para la sugerencia. Estoy probando las dos formas de ver cuál funciona mejor para mis necesidades. – greenset

Cuestiones relacionadas