2012-08-31 28 views
11

Như được mô tả, mục Danh sách của tôi là FrameLayout, có hai chế độ xem bên trong.Chiều cao xem con của Android không khớp với bố mẹ trong mục ListView

ColorView là chế độ xem tùy chỉnh mà tôi đã thực hiện cho màu hiển thị ở chế độ xem toàn bộ.

(chiều cao FrameLayout 's là "wrap_content")

Có vẻ như hoạt động tốt trên thiết bị ICS của tôi, nhưng không hoạt động trên 2.2 giả lập Android của tôi và Android 1.6 G1.

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> 

nó có bất kỳ cách giải quyết hay cách khác để giải quyết này?

EDIT

mã cho 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

Lưu ý để giúp bạn thu hút sự chú ý. – coolcfan

+0

Bạn có thể thêm mã cho 'ColorView' không? – Luksprog

+0

được thêm vào, nó rất đơn giản. – mariotaku

Trả lời

3

rất buồn, không ai biết cách giải quyết vấn đề này.

nhưng cuối cùng tôi đã sử dụng giải pháp thay thế để giải quyết vấn đề này.

mới bố trí 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> 

mã cho 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); 
    } 
} 

nó hoạt động thực sự tốt cho tôi.

screenshot on G1

1

là một yêu cầu để sử dụng ColorView? Tôi hỏi điều này bởi vì nếu bạn không sử dụng nó cho bất cứ điều gì khác nó chỉ là một sự lãng phí để sử dụng nó. Bạn có phụ huynh FrameLayout và bạn nên đặt hình vẽ có thể sử dụng trên ColorView làm nền cho phụ huynh FrameLayout.

+0

Chế độ xem gốc được sử dụng cho một nền khác trong chế độ đa lựa chọn, 'ColorView' không chỉ được sử dụng cho nền mà còn cho nhãn màu đó. – mariotaku

+0

@mariotaku Chế độ đa lựa chọn có nghĩa là gì (thanh hành động theo ngữ cảnh)? Không phải đơn giản là thay đổi nền trên 'Framelayout' tùy thuộc vào tình hình hiện tại? – Luksprog

+0

để tương thích ngược Tôi đã sử dụng một số cách giải quyết http://i.imgur.com/F4X9t.png tính năng này hoạt động trên Android 1.6, bằng cách thay đổi nền 'FrameLayout'. bạn có thể xem mã nguồn đầy đủ ở đây. http://github.com/mariotaku/twidere – mariotaku

16

Chúng tôi chỉ phải đối phó với một vấn đề tương tự. Chúng tôi nhận thấy rằng việc sử dụng match_height trên một chế độ xem là một phần của mục ListView sẽ không hoạt động như mong đợi. Mã sau đây sẽ hoạt động:

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

Bí quyết cơ bản là căn chỉnh chế độ xem màu ở đầu và cuối chế độ xem nội dung. Dù chiều cao của nội dung là bao nhiêu, nó sẽ được chấp nhận bởi chế độ xem màu.

Trên ghi chú bên, như được nêu trong Android's documentation, bạn không nên sử dụng FrameLayout để chứa nhiều hơn một trẻ.

EDIT

Đồng nghiệp của tôi làm tôi nhận thấy rằng nếu chúng tôi sử dụng một LinearLayout là phần tử gốc của mặt hàng đó listview, match_parent làm việc như mong đợi:

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

Tôi thử nghiệm này trên một thiết bị với Android 2.2 và nó hoạt động chính xác.

+1

Cách tiếp cận đồng nghiệp của bạn hoạt động cho tôi! Cảm ơn. –

0

Tạo bố cục tùy chỉnh mở rộng FrameLayout hoặc bố cục khác bất kỳ, sau đó ghi đè phương thức 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); 
       } 
      }); 
     } 
    } 
} 
0

Bản cập nhật @softlete câu trả lời:

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

Các "Chiều cao tối thiểu" được đưa ra bởi bên lề (trên + dưới) của @+id/imageContainer cộng + chiều cao của @+id/image (có thể sử dụng bất kỳ view/layout mà bạn muốn)

Các vấn đề liên quan