2012-08-31 14 views
11

Wie beschrieben, ist meine Liste Artikel FrameLayout, gibt es zwei Ansichten im Inneren.Android Kind Ansicht Höhe nicht übereinstimmen Eltern in ListView Artikel

ColorView ist eine benutzerdefinierte Ansicht, die ich für die Showfarbe in der gesamten Ansicht gemacht habe.

(FrameLayout ‚s Höhe ist "wrap_content")

Es scheint auf meinem ICS Gerät gut zu funktionieren, aber auf meinem Android 2.2 Emulator und Android 1.6 G1 funktioniert nicht.

ICS

Donut

<?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> 

hat es irgendeine Abhilfe oder andere Art und Weise, diese zu lösen?

EDIT

Code für 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); 
    } 

} 
+0

Upvote, damit Sie Aufmerksamkeit bekommen. – coolcfan

+0

Können Sie den Code für 'ColorView' hinzufügen? – Luksprog

+0

hinzugefügt, es ist sehr einfach. – mariotaku

Antwort

3

so traurig, niemand weiß, wie man damit umgeht.

Aber schließlich habe ich einen Workaround verwendet, um dieses Problem zu lösen.

neues Layout 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> 

Code für ColorLabelRelativeLayout:

/* 
*    Twidere - Twitter client for Android 
* 
* Copyright (C) 2012 Mariotaku Lee <[email protected]> 
* 
* 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); 
    } 
} 

es für mich wirklich gut funktioniert.

screenshot on G1

1

ist eine Anforderung, die ColorView zu benutzen? Ich frage das, denn wenn Sie es für nichts anderes verwenden, ist es nur eine Verschwendung, es zu benutzen. Sie haben das Elternteil FrameLayout und Sie sollten das Zeichen festlegen, das auf dem ColorView als den Hintergrund für das Eltern FrameLayout verwandt wird.

+0

root view wird für einen anderen Hintergrund im Multi-Select-Modus verwendet, 'ColorView' wird nicht nur für den Hintergrund, sondern auch für diese Farbbezeichnung verwendet. – mariotaku

+0

@mariotaku Multi-Select-Modus Bedeutung was (Kontext-Aktionsleiste)? Ist es nicht einfacher, den Hintergrund auf dem 'Framelayout' zu ändern, abhängig von der aktuellen Situation? – Luksprog

+0

für die Abwärtskompatibilität Ich habe einige Workarounds verwendet http://i.imgur.com/F4X9t.png dies funktioniert auf Android 1.6, indem Sie 'FrameLayout' Hintergrund ändern. Sie können den vollständigen Quellcode hier sehen. http://github.com/mariotaku/twidere – mariotaku

16

Wir hatten nur mit einem ähnlichen Problem befassen. Wir haben festgestellt, dass die Verwendung von "match_height" in einer Ansicht, die Teil eines ListView-Elements ist, nicht wie erwartet funktioniert. Der folgende Code sollte funktionieren:

<?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> 

Der Trick im Grunde ist die farbige Ansicht auf die oberen und unteren Rand der Seiten auszurichten. Unabhängig davon, wie hoch der Inhalt ist, wird er von der farbigen Ansicht übernommen.

Auf einer Randnotiz, wie in der Android's documentation angegeben, sollten Sie ein FrameLayout nicht mehr als ein Kind enthalten.

EDIT

Mein Kollege hat mich feststellen, dass, wenn wir ein Linearlayout als Stammelement des Listview-Element verwenden, match_parent wie erwartet funktioniert:

<?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> 

ich dies mit auf einem Gerät getestet Android 2.2 und es hat richtig funktioniert.

+1

Ihre Kollegen nähern sich Arbeiten für mich! Vielen Dank. –

0

Erstellen Sie ein benutzerdefiniertes Layout erweitert FrameLayout oder andere Layouts, dann überschreiben Sie die OnLayout-Methode.

@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); 
       } 
      }); 
     } 
    } 
} 
0

Ein Update Antwort auf @softlete:

<?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> 

Die "Mindesthöhe" wird von den Rändern (oben + unten) @+id/imageContainer plus + Höhe @+id/image (können jede Ansicht/Layout verwenden gegebenen dass Sie wollen)

Verwandte Themen