weightsum linearlayout developer bottom addview android layout layoutparams

android - linearlayout - Los parámetros de diseño de vista cargada se ignoran



relative layout android developer (3)

LayoutParams escribir mi propia View personalizada y tengo un problema con LayoutParams .

La idea es extender ViewGroup ( LinearLayout )

public class MyView extends LinearLayout{ public MyView(Context context, AttributeSet attrs) { super(context, attrs); } public MyView(Context context) { super(context); } public void putContent(){ setOrientation(HORIZONTAL); LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); for (int i = 0; i < 5; i++){ View view = inflater.inflate(R.layout.item, null); TextView tv = (TextView)view.findViewById(R.id.item_text); tv.setText("Item " + i); addView(view); } } }

Como puede ver, el método putContent infla elementos y los agrega a mi vista. Aquí hay un diseño de artículo

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF"> <TextView android:text="TextView" android:id="@+id/item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000"/> </LinearLayout>

Y el diseño de la pantalla principal

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android_layout_weight="1" android:text="@string/hello" /> <my.test.MyView android:id="@+id/my_view" android:layout_width="match_parent" android:layout_height="match_parent" android_layout_weight="1" /> </LinearLayout>

Y código de actividad

public class Start extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MyView myView = (MyView)findViewById(R.id.my_view); myView.putContent(); } }

Aquí hay una captura de pantalla de lo que obtengo

El problema es que los atributos del elemento raíz del elemento se ignoran

android:layout_width="match_parent" android:layout_height="match_parent"

Pero como resultado quiero obtener algo como esto (obtengo este resultado cuando reemplazo addView(view); con esta línea)

addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));

Entonces la pregunta es: ¿cómo puedo lograr este resultado sin LayoutParams codificados? ¡Gracias por cualquier ayuda!

actualizar

También miro los campos de variables de view en el modo de depuración - mLayoutParams es null , y no se volvió nulo cuando addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F)); view inflada al padre con addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F)); .

Pero mLayoutParams of child de la vista recién cargada no es nulo. ¿Por qué LayoutParams del único elemento raíz en el diseño xml se ignora cuando se ve inflado?


De acuerdo, si entiendo correctamente, tienes el XML mencionado anteriormente en ll , y estás agregando algo ( R.layout.item_layout ) a él.

Los problemas que veo son:

  • Su diseño base (el xml que se le dio, cargado en ll ) tiene match_parent , pero no sabemos si incluso tiene un padre. Entonces el comportamiento es difícil de adivinar.
  • No especificó cuáles son los parámetros de diseño para el artículo que está agregando (aún suponiendo que R.layout.item_layout no es el xml que ha mostrado). Por lo tanto, podría ser un comportamiento esperado, o incluso indefinido (por lo que se espera que sea inesperado).

Podría ser que hay demasiado código para publicar aquí, no sé, pero entonces sería mejor que utilizaras el visor de jerarquía para ver qué parámetros tienen las vistas en tu árbol, para que realmente puedas ver lo que está sucediendo.

Además, tenga en cuenta que no todas las Vistas admiten margen .

Aunque una vista puede definir un relleno, no proporciona ningún soporte para los márgenes. Sin embargo, los grupos de vista proporcionan tal soporte. Consulte ViewGroup y ViewGroup.MarginLayoutParams para obtener más información.


En los parámetros "layout_" de Android, consulte la forma en que se comporta la Vista actual en su diseño principal. En este caso, su padre es ll, pero no podemos ver qué es eso.

En cuanto al diseño de TextView dentro de LinearLayout, dado que LinearLayout es vertical, todos sus elementos secundarios tienen su layout_height anulado por "wrap_content" para que puedan disponerse uno debajo del otro correctamente.

Entonces, la pregunta es, ¿qué es lo que realmente ves y qué es lo que quieres ver?


Use la siguiente declaración para inflar:

View view = inflater.inflate( R.layout.item /* resource id */, MyView.this /* parent */, false /*attachToRoot*/);