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


La altura de la vista de niño de Android no coincide con el padre en el elemento de ListView

Como se describe, mi elemento de lista es FrameLayout , hay dos vistas dentro.

ColorView es una vista personalizada que hice para mostrar el color en toda la vista.

  • La red de Android es inaccesible - ENETUNREACH
  • Android Imagebutton Cambiar imagen OnClick
  • ¿Cómo implementar la vista de pila personalizada en android?
  • ¿Qué diferencia hay entre getSupportFragmentManager () y getChildFragmentManager ()?
  • ¿Cómo mostrar un diseño encima del otro programmatically en mi caso?
  • Uso del patrón de diseño Singleton para SQLiteDatabase
  • (La altura de FrameLayout es "wrap_content")

    Parece que funciona bien en mi dispositivo ICS, pero no funciona en mi emulador Android 2.2 y Android 1.6 G1.

    ICS

    Rosquilla

     <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <org.mariotaku.twidere.view.ColorView android:id="@+id/status_background" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:background="@drawable/ic_label_user"/> <RelativeLayout android:id="@+id/status_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="6dp" android:paddingRight="6dp" android:paddingTop="6dp"> <org.mariotaku.twidere.view.RoundCorneredImageView android:id="@+id/profile_image" android:layout_width="@dimen/profile_image_size" android:layout_height="@dimen/profile_image_size" android:layout_marginLeft="6dp" android:scaleType="fitCenter"/> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignWithParentIfMissing="true" android:layout_marginLeft="6dp" android:layout_toLeftOf="@+id/time" android:layout_toRightOf="@+id/profile_image" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorPrimary" android:textStyle="bold"/> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/name" android:layout_alignParentRight="true" android:layout_alignWithParentIfMissing="true" android:layout_below="@+id/name" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/name" android:layout_alignParentRight="true" android:layout_alignWithParentIfMissing="true" android:drawablePadding="3dp" android:gravity="center_vertical|right" android:textColor="?android:attr/textColorSecondary"/> <ImageView android:id="@+id/image_preview" android:layout_width="@dimen/preview_image_size" android:layout_height="@dimen/preview_image_size" android:layout_alignWithParentIfMissing="true" android:layout_below="@+id/text" android:layout_marginLeft="16dp" android:layout_marginTop="3dp" android:layout_toRightOf="@+id/profile_image" android:background="@drawable/image_preview_background" android:drawablePadding="3dp" android:scaleType="fitCenter" android:visibility="gone"/> <TextView android:id="@+id/reply_retweet_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignWithParentIfMissing="true" android:layout_below="@+id/image_preview" android:layout_toRightOf="@+id/profile_image" android:drawablePadding="3dp" android:paddingLeft="6dp" android:paddingTop="3dp" android:textColor="?android:attr/textColorSecondary"/> </RelativeLayout> <TextView android:id="@+id/list_gap_text" android:layout_width="wrap_content" android:layout_height="48dp" android:layout_gravity="center" android:gravity="center" android:text="@string/tap_to_load_more" android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" android:visibility="gone"/> </FrameLayout> 

    ¿Tiene alguna solución u otra forma de resolver esto?

    EDITAR

    De ColorView para ColorView

     package org.mariotaku.twidere.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.util.AttributeSet; import android.view.View; public class ColorView extends View { private int mColor = Color.TRANSPARENT; public ColorView(Context context) { this(context, null); } public ColorView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ColorView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setColor(int color) { mColor = color; invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(mColor); } } 

  • Compruebe JSONArray para valor específico
  • Creación de una notificación local en respuesta a una notificación push (desde firebase) en cordova / ionic
  • Cómo cambiar el color de texto del conmutador en Android
  • ¿Cómo regresar a la última actividad lanzada al volver a iniciar la aplicación después de presionar HOME?
  • Android ImageView - Obtener coordenadas de tap (clic) independientemente de la ubicación de desplazamiento o la escala de zoom
  • ¿Cómo están creando nuevos perfiles de aplicaciones VPN existentes en Android 2.0 - 2.3?
  • 5 Solutions collect form web for “La altura de la vista de niño de Android no coincide con el padre en el elemento de ListView”

    Sólo tuvimos que lidiar con un problema similar. Hemos notado que usar match_height en una vista que es parte de un elemento ListView no funcionará como se esperaba. El código siguiente debería funcionar:

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/color_bar" > <!-- Put the content views of your item here. You do not have to use frame layout, it can be any kind of view. --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="8dp" android:text="@string/app_name" /> </FrameLayout> <View android:id="@id/color_bar" android:layout_width="10dp" android:layout_height="match_parent" android:layout_alignBottom="@id/content" android:layout_alignParentRight="true" android:layout_alignTop="@id/content" android:background="@android:color/darker_gray" /> </RelativeLayout> 

    El truco es básicamente alinear la vista de color a la parte superior e inferior de la vista de contenido. Sea cual sea la altura del contenido, será adoptada por la vista de color.

    En una nota lateral, como se indica en la documentación de Android , no debe utilizar un FrameLayout para contener más de un hijo.

    EDITAR

    Mi colega me hizo notar que si usamos LinearLayout como el elemento raíz del elemento listview, match_parent funciona como se esperaba:

     <?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="horizontal" > <TextView android:id="@+id/content" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:padding="8dp" android:text="@string/app_name" /> <View android:id="@+id/color_bar" android:layout_width="10dp" android:layout_height="match_parent" android:background="@android:color/darker_gray" /> </LinearLayout> 

    He probado esto en un dispositivo con Android 2.2 y funcionó correctamente.

    Tan triste, nadie sabe cómo lidiar con esto.

    Pero finalmente utilicé una solución para resolver este problema.

    Nueva disposición XML:

     <?xml version="1.0" encoding="utf-8"?> <org.mariotaku.twidere.view.ColorLabelRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="6dp"> <org.mariotaku.twidere.view.RoundCorneredImageView android:id="@+id/profile_image" android:layout_width="@dimen/profile_image_size" android:layout_height="@dimen/profile_image_size" android:scaleType="fitCenter"/> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignWithParentIfMissing="true" android:layout_marginLeft="3dp" android:layout_toLeftOf="@+id/time" android:layout_toRightOf="@+id/profile_image" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorPrimary" android:textStyle="bold"/> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/name" android:layout_alignParentRight="true" android:layout_alignWithParentIfMissing="true" android:layout_below="@+id/name" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/name" android:layout_alignParentRight="true" android:layout_alignWithParentIfMissing="true" android:drawablePadding="3dp" android:gravity="center_vertical|right" android:textColor="?android:attr/textColorSecondary"/> <ImageView android:id="@+id/image_preview" android:layout_width="@dimen/preview_image_size" android:layout_height="@dimen/preview_image_size" android:layout_alignWithParentIfMissing="true" android:layout_below="@+id/text" android:layout_marginLeft="16dp" android:layout_marginTop="3dp" android:layout_toRightOf="@+id/profile_image" android:background="@drawable/image_preview_background" android:drawablePadding="3dp" android:scaleType="fitCenter" android:visibility="gone"/> <TextView android:id="@+id/reply_retweet_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignWithParentIfMissing="true" android:layout_below="@+id/image_preview" android:layout_toRightOf="@+id/profile_image" android:drawablePadding="3dp" android:paddingLeft="6dp" android:paddingTop="3dp" android:textColor="?android:attr/textColorSecondary"/> <TextView android:id="@+id/list_gap_text" android:layout_width="wrap_content" android:layout_height="42dp" android:layout_centerInParent="true" android:gravity="center" android:text="@string/tap_to_load_more" android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" android:visibility="gone"/> </org.mariotaku.twidere.view.ColorLabelRelativeLayout> 

    Código para ColorLabelRelativeLayout :

     /* * Twidere - Twitter client for Android * * Copyright (C) 2012 Mariotaku Lee <mariotaku.lee@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.mariotaku.twidere.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.RelativeLayout; public class ColorLabelRelativeLayout extends RelativeLayout { private final Paint mPaintLeft = new Paint(), mPaintRight = new Paint(), mPaintBackground = new Paint(); private final Rect mRectLeft = new Rect(), mRectRight = new Rect(), mRectBackground = new Rect(); private final float mDensity; public ColorLabelRelativeLayout(Context context) { this(context, null); } public ColorLabelRelativeLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ColorLabelRelativeLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setWillNotDraw(false); mDensity = context.getResources().getDisplayMetrics().density; mPaintLeft.setColor(Color.TRANSPARENT); mPaintRight.setColor(Color.TRANSPARENT); mPaintBackground.setColor(Color.TRANSPARENT); } public void drawLabel(int left, int right, int background) { mPaintBackground.setColor(background); mPaintLeft.setColor(left); mPaintRight.setColor(right); invalidate(); } public void drawLeft(int color) { drawLabel(color, mPaintRight.getColor(), mPaintBackground.getColor()); } public void drawRight(int color) { drawLabel(mPaintLeft.getColor(), color, mPaintBackground.getColor()); } public void drawBackground(int color) { drawLabel(mPaintLeft.getColor(), mPaintRight.getColor(), color); } @Override public void onDraw(Canvas canvas) { canvas.drawRect(mRectBackground, mPaintBackground); canvas.drawRect(mRectLeft, mPaintLeft); canvas.drawRect(mRectRight, mPaintRight); super.onDraw(canvas); } @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { mRectBackground.set(0, 0, w, h); mRectLeft.set(0, 0, (int)(4 * mDensity), h); mRectRight.set(w - (int)(4 * mDensity), 0, w, h); super.onSizeChanged(w, h, oldw, oldh); } } 

    Funciona muy bien para mí.

    Captura de pantalla en G1

    ¿Es obligatorio utilizar ColorView ? Lo pregunto porque si no lo usas para otra cosa, es sólo un desperdicio usarlo. Tiene el FrameLayout padre y debería establecer el drawable utilizado en ColorView como el fondo para FrameLayout principal.

    Cree un Layout personalizado extiende FrameLayout, u otros diseños, y luego reemplaza el método onLayout.

     @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); Log.d("onLayout", getWidth() + "x" + getHeight()); final View statusView = findViewById(R.id.status_background); if (statusView.getVisibility() == VISIBLE) { final LayoutParams p = (LayoutParams) statusView.getLayoutParams(); if (p.width != getWidth() || p.height != getHeight()) { p.width = getWidth(); p.height = getHeight(); statusView.post(new Runnable() { @Override public void run() { statusView.setLayoutParams(p); } }); } } } 

    Una actualización a @softlete responde:

     <?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="wrap_content" android:background="@android:color/transparent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"> <RelativeLayout android:id="@+id/messageContent" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_marginRight="20dp" android:layout_marginLeft="20dp" android:padding="5dp" android:background="@drawable/message_bg"> <TextView android:id="@+id/message" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="20dp" android:text="un mensaje supremamente largo debe ir aqui para probar el layout" android:textColor="@android:color/black" android:textSize="16dp"/> </RelativeLayout> <RelativeLayout android:id="@+id/imageContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:paddingTop="10dp" android:paddingBottom="10dp"> <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/image" android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/com_facebook_profile_default_icon" /> </RelativeLayout> </RelativeLayout> </LinearLayout> 

    La "Altura mínima" está dada por los márgenes (arriba + abajo) de @+id/imageContainer plus + height de @+id/image (puede usar cualquier vista / diseño que desee)

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