Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Los parámetros de diseño de la vista cargada se ignoran

Estoy tratando de escribir mi propia View personalizada y tengo problemas 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 los elementos y agrega a mi vista. Aquí está una disposición del 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 la disposición 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

Introduzca aquí la descripción de la imagen

Así que el problema es: los atributos del elemento raíz del elemento se ignoran

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

Pero en el resultado que quiero conseguir algo como esto (obtengo este resultado cuando reemplazar addView(view); con esta línea)

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

Introduzca aquí la descripción de la imagen

Así que la pregunta es: ¿cómo puedo lograr este resultado sin LayoutParams codificado duro? ¡Gracias por cualquier ayuda!

actualizar

También miro los campos de variables de view en el modo de depuración – el mLayoutParams es null , y no se convirtió en nulo cuando agrego la view inflada en el padre con addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F)); . Introduzca aquí la descripción de la imagen

Pero mLayoutParams de un niño de la vista cargada no es nulo. ¿Por qué LayoutParams de sólo el elemento raíz en el diseño xml se ignoran cuando la vista inflada?

  • Configuración del margen del botón mediante programación
  • ¿Cómo configurar layout_alignParentRight = "false" mediante programación?
  • Configuración de los parámetros de diseño en android
  • Cómo establecer mediante programación el atributo layout_align_parent_right de un botón en Disposición relativa?
  • Animación en el cambio de LayoutParams en LinearLayout
  • Android Salir del modo de pantalla completa
  • ¿Cómo puedo eliminar mediante programación una regla existente que se definió en XML?
  • ¿Qué unidad de medida utiliza LayoutParams?
  • 3 Solutions collect form web for “Los parámetros de diseño de la vista cargada se ignoran”

    Use la siguiente instrucción para inflar:

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

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

    Los problemas que veo son:

    • Su diseño base (el xml que se dio, cargado en ll ) tiene match_parent , pero no sabemos si incluso tiene un padre. Así que el comportamiento es difícil de adivinar.
    • No especificaste cuáles son los parámetros de diseño para el elemento que estás agregando (asumiendo que R.layout.item_layout no es el xml que hayas mostrado). Así que se podría esperar comportamiento, 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 podría ser mejor usar el visor de jerarquía para comprobar qué params las vistas en su árbol tienen, para que pueda ver realmente lo que está pasando.

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

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

    En los parámetros de "layout_" de Android se refieren a la forma en que la vista actual se comporta en su diseño principal. En este caso, su padre es ll, pero no podemos ver lo que es.

    En cuanto a la disposición de TextView dentro de LinearLayout, ya que el LinearLayout es vertical, todos sus hijos tienen automáticamente su layout_height anulado por "wrap_content" para que puedan ser dispuestos uno debajo de otro correctamente.

    Así que ahora la pregunta es, ¿qué ves realmente y qué quieres ver?

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.