2013-01-03 105 views
0

我使用HorizontalListView提供here,我試圖以顯示與一個固定的高度和寬度自定義視圖,就像這樣:固定的高度不顯示正確的高度

public class MyView extends View { 

    public MyView(Context context) { 
     super(context); 

     init(); 
    } 

    private void init() { 
     setBackgroundColor((int) (Math.random() * Integer.MAX_VALUE)); 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 

     int h = getHeight(); // shows 255, correct height 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int w = MeasureSpec.makeMeasureSpec(425, MeasureSpec.EXACTLY); 
     int h = MeasureSpec.makeMeasureSpec(255, MeasureSpec.EXACTLY); 
     super.onMeasure(w, h); 
    } 

} 

顯示當這MyView在一個正常的LinearLayout,高度和寬度都是完美的。但是,當我在HorizontalListView中展示視圖時,寬度是完美的,但高度不是。看到此屏幕截圖:

enter image description here

寬度425px,這是正確的,該高度是僅有160像素,而不是255。

HorizontalListView的源有此方法:

private void addAndMeasureChild(final View child, int viewPos) { 
    LayoutParams params = child.getLayoutParams(); 
    if(params == null) { 
     params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
    } 

    addViewInLayout(child, viewPos, params, true); 
    child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), 
       MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); 
} 

有什麼我應該改變這種方法,還是有什麼其他的東西使這項工作?

+0

您能向我們展示您定義Horizo​​ntalListView高度的位置嗎? – dmon

+0

我在xml中定義了一個200dp的值。黑色的橫幅是'Horizo​​ntalListView'的背景。 – nhaarman

+0

說那..我有一個透明的操作欄,因此我使用'android:paddingTop =「63dp」'和'android:paddingBottom =「15dp」'。當刪除這兩條線的項目的高度是正確的。謝謝你讓我看着正確的方向! – nhaarman

回答

0

當你做int h = MeasureSpec.makeMeasureSpec(255, MeasureSpec.EXACTLY);時,那個255值是一個PX值。如果您說XML中的高度是200 DP,那麼將根據設備調整值。不確定顯示的屏幕是HDPI還是XHDPI(我的猜測是後者),它會倍增,因此您的200 DP在HDPI電話(x1.5)中變成300 PX。您可以使用XML中的PX值,也可以在values.xml中定義一個012DPD值,即200DP。

偏好是後者。您可以在XML中使用該維度值,並在創建視圖時從資源中檢索該值。這意味着,如果您希望在某個時候使其更大,則只需更改一個值即可完成。

編輯

我看你找到了真正的問題。無論如何,你仍然應該使用維度方法,它會讓你的代碼更清晰,並且可以在任何手機中工作(255只會在特定的組合中看起來正確)。

+0

感謝您的努力! 255px值實際上是一個已經從dp值轉換的參數。我沒有包括這個,以保持代碼的可讀性;) – nhaarman

+0

啊,非常好,然後:) – dmon