结合layout_weight和maxHeight

时间:2015-04-17 09:42:15

标签: android

我对Android编程很陌生,而且我遇到了一个简单的问题。

我有一个带有一些按钮和徽标的基本主页。我使用LinearLayoutlayout_weight属性来分发所有组件。

这是我的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="iut.project.findmeapp.MainActivity" >

    <ImageView
        android:id="@+id/activityMainAppLogoIv"
        android:layout_width="match_parent"
        android:layout_height="@dimen/null_height"
        android:contentDescription="@string/description_logo"
        android:layout_weight="1"
        android:maxHeight="@dimen/img_maxHeight"
        android:layout_margin="@dimen/img_margin"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/activityMainMyEventsBtn"
        android:layout_width="match_parent"
        android:layout_height="@dimen/null_height"
        android:layout_marginTop="@dimen/button_margin_vertical"
        android:layout_marginBottom="@dimen/button_margin_vertical"
        android:layout_weight="1"
        android:text="@string/my_events" />

    <Button
        android:id="@+id/activityMainMyContactsBtn"
        android:layout_width="match_parent"
        android:layout_height="@dimen/null_height"
        android:layout_marginTop="@dimen/button_margin_vertical"
        android:layout_marginBottom="@dimen/button_margin_vertical"
        android:layout_weight="1"
        android:text="@string/my_contacts" />

    <Button
        android:id="@+id/activityMainLastNotifBtn"
        android:layout_width="match_parent"
        android:layout_height="@dimen/null_height"
        android:layout_marginTop="@dimen/button_margin_vertical"
        android:layout_marginBottom="@dimen/button_margin_vertical"
        android:layout_weight="1"
        android:text="@string/last_notification" />

    <TextView
        android:id="@+id/activityMainCopyrightTv"
        android:layout_width="match_parent"
        android:layout_height="@dimen/null_height"
        android:gravity="center"
        android:layout_weight="0.5"
        android:layout_margin="@dimen/tw_margin"
        android:text="@string/copyright" />

</LinearLayout>

(注意:@dimen/null_height0dp

我的问题是我希望图像随屏幕尺寸缩放,但我不想让它像素化:我设置的最大高度 200px

以下几行似乎不起作用,因为图片没有限制,完全忽略了maxHeight属性。

android:layout_weight="1"
android:maxHeight="@dimen/img_maxHeight"

实际上它看起来像这样(示例图片):

Homepage

效果很好,但是当我将maxHeight设置为10px时,没有任何变化。

我怎样才能做到这一点?我更喜欢使用LinearLayout

提前谢谢。

3 个答案:

答案 0 :(得分:2)

我认为您不能将layout_weightmaxHeight合并。 您可以尝试子类化ImageView来覆盖onMeasure方法,如下所示:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

答案 1 :(得分:2)

感谢Evripidis Drakos将我指向了正确的方向。只需要检查一下,如果实际需要,只需设置最大高度。

public class MaxHeightImageView extends ImageView {

public static final int MAX_HEIGHT_NOT_SET = -1;
public static final int INDEX_MAX_HEIGHT = 0;
private static final int[] STYLE_ATTRIBUTE_ARRAY = {
        android.R.attr.maxHeight,
};

private int myMaxHeight;

public MaxHeightImageView(Context context) {
    super(context);
    init(context, null);
}

public MaxHeightImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

public MaxHeightImageView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public MaxHeightImageView(Context context, AttributeSet attrs, int defStyleAttr,
        int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int size = MeasureSpec.getSize(heightMeasureSpec);
    if(MAX_HEIGHT_NOT_SET != myMaxHeight && size > myMaxHeight) {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(myMaxHeight, MeasureSpec.AT_MOST);

    }

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

private void init(Context context, AttributeSet attrs) {
    if(context != null) {
        TypedArray ta = context.obtainStyledAttributes(attrs,
                STYLE_ATTRIBUTE_ARRAY);
        myMaxHeight = ta.getDimensionPixelSize(INDEX_MAX_HEIGHT, 0);
    } else {
        myMaxHeight = MAX_HEIGHT_NOT_SET;
    }
}
}

答案 2 :(得分:1)

如果你想为你的图像设置精确的高度,你应该使用权重为weightSum属性

修改

对于固定高度,不要为weight提供imageview,只需为imageview采用父布局,然后为该线性布局(父布局)添加权重,为imageview提供高度作为换行内容和maxHeight。当您使用weightheight="0dp"时,内容将捕获整个height,因此它将忽略maxHeight

试试这个

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:weightSum="5"
    tools:context="iut.project.findmeapp.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/activityMainAppLogoIv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:contentDescription="@string/quantity_hint"
            android:maxHeight="200px"
            android:src="@drawable/ic_launcher" />
    </LinearLayout>

    <Button
        android:id="@+id/activityMainMyEventsBtn"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="my_events" />

    <Button
        android:id="@+id/activityMainMyContactsBtn"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="my_contacts" />

    <Button
        android:id="@+id/activityMainLastNotifBtn"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="last_notification" />

    <TextView
        android:id="@+id/activityMainCopyrightTv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight=".5"
        android:gravity="center"
        android:text="copyright" />

</LinearLayout>

enter image description here