Problemas de Android para convertir ViewGroup con niños en mapa de bits

Estoy convirtiendo con éxito un ViewGroup (RelativeLayout) en un mapa de bits usando una lona. Sin embargo, cuando el sorteo sucede, sólo veo el ViewGroup con su fondo dibujable y no sus hijos (dos TextViews) que deben ser establecidos dentro del RelativeLayout usando reglas como FILL_PARENT.

El RelativeLayout se crea utilizando la siguiente función estática:

public static RelativeLayout createProgrammeView(Context context, int width, int height, String title, String time) { RelativeLayout.LayoutParams params; // Layout Root View (RelativeLayout) RelativeLayout rlv = new RelativeLayout(context); params = new RelativeLayout.LayoutParams(width, height); rlv.setLayoutParams(params); rlv.setPadding(3, 3, 3, 3); rlv.setBackgroundResource(R.drawable.background); // Layout Title TextView tv = new TextView(context); params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_TOP); params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); tv.setId(R.id.title); tv.setLayoutParams(params); tv.setGravity(Gravity.CENTER_VERTICAL); tv.setSingleLine(true); tv.setEllipsize(TruncateAt.END); tv.setTextColor(Color.parseColor("#fff")); tv.setTextSize(11); tv.setText(title); rlv.addView(tv); // Layout Start Time tv = new TextView(context); params = new RelativeLayout.LayoutParams(16, RelativeLayout.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, R.id.title); params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); params.setMargins(0, 4, 0, 0); tv.setId(R.id.time); tv.setLayoutParams(params); tv.setGravity(Gravity.CENTER_VERTICAL); tv.setSingleLine(true); tv.setEllipsize(null); tv.setTextColor(Color.parseColor("#fff")); tv.setTextSize(10); tv.setText(time); rlv.addView(tv); } return rlv; } 

A continuación, utilizar lo siguiente para convertir el RelativeLayout en un mapa de bits:

 public static Bitmap loadBitmapFromView(RelativeLayout v) { Bitmap b = Bitmap.createBitmap(v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.RGB_565); Canvas c = new Canvas(b); v.draw(c); return b; } 

Como se esperaba esto me da un bonito mapa de bits en las dimensiones que necesito con el fondo dibujable, pero los niños no están en el mapa de bits. Llamo a estas funciones bastante para construir una imagen grande que luego se dibuja en una vista personalizada en mi actividad.

Este es el bucle que llama a la función estática:

 public static void renderViews(final Context context) { largeBitmap = Bitmap.createBitmap(largeWidth, largeHeight, Bitmap.Config.RGB_565); Canvas largeCanvas = new Canvas(largeBitmap); for (int i = 0; i < items.size(); i++) { int leftMargin = ...SOME CALCULATIONS...; RelativeLayout newView = createProgrammeView(context, width, rowHeight, "Title", "21:00"); Bitmap newViewBitmap = loadBitmapFromView(newView); largeCanvas.drawBitmap(newViewBitmap, leftMargin, 0, new Paint()); } myCustomView.invalidate(); } 

Mi vista personalizada anula la función onDraw ():

 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(largeBitmap, 0, 0, null); } 

De lo que puedo ver creo que esto es porque Android no llama a un measure () en el niño Vistas. He intentado llamar manualmente, pero esto no soluciona el problema.

Por lo tanto, supongo que lo que me gustaría saber es, ¿cómo puedo lograr la conversión de un RelativeLayout con los niños en un mapa de bits y obtener Android para medir a los niños para que respeten sus reglas relativas a la disposición.

Muchas gracias a cualquiera que me ayude a resolver esto.

Robar

El problema es que no midió ni diseñó el contenedor. Debe llamar a v.measure(widthSpec, heightSpec) y luego v.layout(left, top, right, bottom) antes de que el dibujo pueda funcionar. El primer método se asegurará de que la vista sepa cuán grande quiere que sea, y el segundo método garantizará que los niños estén posicionados correctamente.

En su caso usted haría:

 v.measure(MeasureSpec.makeMeasureSpec(v.getLayoutParams().width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(v.getLayoutParams().height, MeasureSpec.EXACTLY)); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.RGB_565); Canvas c = new Canvas(b); v.draw(c); 

También podría ser útil la solución basada en DisplayMetrics para los Layouts. Para no repetir, mira aquí .

  • Añadir dinámicamente una vista al diseño de la actividad
  • ImageView rellena el ancho o altura de los padres, pero mantiene la relación de aspecto
  • RelativeLayout "No se pudo resolver el recurso ..." Android
  • Layout_below elemento dentro del diseño incluido
  • ¿Diferencia entre el marco y el diseño relativo?
  • Mostrar imagenVer superior de RelativeLayout
  • Android relative layout below 2 artículos
  • Cómo anclar un botón en la parte inferior de un diseño relativo en android
  • ¿Cómo centrar dos vistas dentro de una disposición relativa?
  • Anula la onMeasure () de RelativeLayout para restringir su relación de aspecto
  • Android alinear el centro de diseño
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.