0

ここHorizontalListViewで提供されているものを使用しており、次のように、高さと幅が固定されたカスタムビューを表示しようとしています。

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と、幅は完璧ですが、高さは完璧ではありません。このスクリーンショットを参照してください:

ここに画像の説明を入力してください

幅は425pxで、これは正しいです。高さは255ではなく160pxです。

ソースに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));
}

この方法で変更する必要があるものはありますか、それともこれを機能させるために他に何かありますか?

4

1 に答える 1

0

するとint h = MeasureSpec.makeMeasureSpec(255, MeasureSpec.EXACTLY);、その255値はPX値になります。XMLで高さが200DPであると言った場合、その値はデバイスに応じて調整されます。表示される画面がHDPIであるかXHDPIであるか(私の推測では後者)がわからない場合は乗算されるため、HDPI電話(x1.5)では200DPが300PXになります。XMLでPX値を使用するか、values.xmlで200DPのディメンションDP値を定義できます。

後者が優先されます。XMLでそのディメンション値を使用し、ビューを作成するときにリソースからそれを取得できます。つまり、ある時点でそれを大きくしたい場合は、1つの値を変更するだけで完了です。

編集

私はあなたが本当の問題を見つけたのを見ます。いずれの場合も、ディメンションアプローチを使用する必要があります。これにより、コードがよりクリーンになり、どの電話でも機能します(255は特定の組み合わせでのみ正しく表示されます)。

于 2013-01-03T13:38:45.320 に答える