programacion - manual de android en pdf
Android consigue el ancho de vista creado programáticamente (5)
He creado TextView programáticamente, así:
TextView mTextView = new TextView(getApplicationContext());
final LayoutParams params = new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
((MarginLayoutParams) params).setMargins(8, 8, 0, 0);
mTextView.setText(mText);
mTextView.setLayoutParams(params);
mTextView.setPadding(2, 2, 2, 2);
mTextView.setBackground(getResources().getDrawable(R.drawable.note_corps));
tagMap.addView(mTextView);
textViewsWidth = mTextView.getWidth();
Pero mTextView.getWidth () siempre devuelve 0
Y si lo intento:
mTextView.getLayoutParams().width
Devuelve el valor correspondiente de LayoutParams en la clase LayoutParams (-1 o -2)
¿Cómo puedo obtener el ancho de la vista?
EDITAR Necesito hacer esto aquí:
@Override
public void onPostExecute(Hashtable<String, Integer> hash){
final ScrollView tagMapScroll = (ScrollView) findViewById(R.id.tagMapScroll);
final LinearLayout tagMap = (LinearLayout) findViewById(R.id.tagMap);
final ArrayList<Integer> arr = new ArrayList<Integer>(hash.values());
final Enumeration<String> e = hash.keys();
int index = 0;
int textViewsWidth = 0;
while(e.hasMoreElements()){
final TextView tV = new TextView(getApplicationContext());
tV.setTextColor(Color.parseColor("#666666"));
tV.setText(Html.fromHtml(randomColor() + e.nextElement()));
tV.setTextSize(arr.get(index));
final LayoutParams params = new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
((MarginLayoutParams) params).setMargins(8, 8, 0, 0);
tV.setLayoutParams(params);
tV.setPadding(2, 2, 2, 2);
tV.setBackground(getResources().getDrawable(R.drawable.note_corps));
tagMap.addView(tV);
textViewsWidth += tV.getWidth();
index++;
}
tagMapScroll.setVisibility(ScrollView.VISIBLE);
}
SOLUCIÓN DE EDICIÓN Utilicé esto de la respuesta de @ androiduser:
mTextView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
int width = mTextView.getMeasuredWidth();
int height = mTextView.getMeasuredHeight();
Problema resuelto !
Debe usar la clase ViewTreeObserver que se usa para registrar escuchas que pueden ser notificadas de cambios globales en el árbol de vista. Dichos eventos globales incluyen, pero no se limitan a, el diseño de todo el árbol, el comienzo del paso de dibujo, el cambio del modo táctil.
En la actividad onCreate mehotd pon esto:
ViewTreeObserver vto = mTextView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mTextView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int viewWidth = mTextView.getMeasuredWidth();
}
});
En este método puedes obtener el ancho alto de la vista.
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
int width = mTextView.getWidth();
int height = mTextView.getHeight();
}
y definir TextView mTextView
como global
Utilicé esta solución:
yourView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Ensure you call it only once
yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// Here you can get the size :)
}
});
esos valores son valores constantes para FILL_PARENT y WRAP_CONTENT. Si desea verificar el tamaño de la vista, puede intentarlo de esta manera:
tagMap.addView(mTextView);
tagMap.post(new Runnable() {
@Override
public void run() {
mTextView. getWidth();
}
});
tienes que esperar hasta que Android dibuje el TextView
. De esta manera, está publicando un Runnable en la cola de mapa de etiquetas, que se ejecuta, con suerte después de que la vista de texto sea un dibujo (por lo tanto, debe ser peso y altura)
obtener de esta manera:
tV.post(new Runnable() {
@Override
public void run() {
int width=tV.getMeasuredWidth();
}
});