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
) tienematch_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*/);