3

我有这样的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_toLeftOf="@+id/my_image"
    android:ellipsize="end"
    android:singleLine="true"
    android:text="Some text"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<ImageView
    android:id="@+id/my_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/title"
    android:layout_alignBottom="@+id/title"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:adjustViewBounds="true"
    android:src="@drawable/my_bitmap_image" />

这种布局几乎可以满足我的需要:它使图像视图高度与文本视图相同。拉伸的图像图形内容也保持纵横比。

但是,图像视图的宽度不会改变!结果,我在文本和图像视图之间有很大的差距!作为临时解决方案,我覆盖View#onLayout.

问题:如何更改 xml 布局中的图像宽度?

更新:

这是我需要的最终布局(文本 + 一些图像)。看第一张图片:它的宽度应该与其中的缩放图像完全相同,没有填充和边距:

在此处输入图像描述

4

7 回答 7

4

对于imageView您可以将图像添加到线性布局并赋予权重属性。例如,如果您有 3 张图像,则将linearlayout权重设为31,然后对于每张图像,您将权重设为 1。这样,所有图像的宽度将统一对齐。将线性方向作为水平方向的希望,所以你明白了我的意思。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:weightSum="3"
     >
   <ImageView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:layout_weight ="1" />

    <ImageView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:layout_weight ="1" />

    <ImageView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:layout_weight ="1" />
     </LinearLayout>
于 2012-10-16T09:54:22.443 回答
2

好的,正如我从答案中看到的那样,没有解决方案可以强制图像视图按比例改变它们的宽度和高度。因此,这只能以编程方式解决。下面是我的解决方案:

a)创建您的自定义布局类

(不要忘记使用公共访问修饰符覆盖所有父构造函数,否则 GUI 编辑器将失败):

public class MyLayout extends RelativeLayout {...

b) 覆盖方法: 已弃用 - 在此方法中更改布局参数可能会导致副作用。请参阅下面的推荐方法

protected void onLayout(boolean changed, int l, int t, int r, int b) {

ImageView icon = (ImageView) findViewById(R.id.my_image); icon.setMaxWidth(icon.getMeasuredHeight());

super.onLayout(changed, l, t, r, b);

}

b) 添加创建方法:

public static MyLayout createLayout(ViewGroup parent) {
Context context = parent.getContext();
MyLayout item = (MyLayout) LayoutInflater.from(context).inflate(
            R.layout.my_layout, parent, false);    
TextView tv = (TextView) findViewById(R.id.title);
ImageView icon = (ImageView) findViewById(R.id.my_image);
ViewGroup.LayoutParams p = icon.getLayoutParams();
p.width =   (int) tv.getTextSize();;
icon.setLayoutParams(p);
return item;
}

c) 最终布局:

<?xml version="1.0" encoding="utf-8"?>
<com.mypackage.MyLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/my_image"
android:ellipsize="end"
android:singleLine="true"
android:text="Some text"
android:textAppearance="?android:attr/textAppearanceMedium" />

<ImageView
android:id="@+id/my_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/title"
android:layout_alignBottom="@+id/title"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:adjustViewBounds="true"
android:src="@drawable/my_bitmap_image" />
</com.mypackage.MyLayout>
于 2012-10-16T10:58:00.977 回答
1

代替RelativeLayout,使用LinearLayout。您可以添加“重量”属性以确保所需的间距。

看下面的代码

    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/logonFormButtons"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="true"       
    android:orientation="horizontal">

    <TextView
        android:id="@+id/logonFormBTLogon"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"            
        android:text="Some Text"
        android:layout_weight="0.5" />

    <ImageView
        android:id="@+id/logonFormBTCancel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"            
        android:src="@drawable/apk"
        android:layout_weight="0.5" />
    </LinearLayout>
于 2012-10-16T09:43:04.963 回答
0

我想这与android:layout_alignParentRight="true"您的 ImageView 有关。你试过layout_toRightOf="@id/title"吗?

您也可以尝试android:scaleType="fitStart"使用 ImageView。这应该将图像与 ImageView 的左上角对齐。

于 2012-10-16T08:44:51.480 回答
0

尝试将scaleType = fitXYORcenterInside属性添加到 imageView

于 2012-10-16T08:46:22.730 回答
0

至于我,我很欣赏使用 getLayoutParams() 在我的代码中动态更改宽度或高度...例如

DisplayMetrics displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    int height = displaymetrics.heightPixels;
    int wwidth = displaymetrics.widthPixels;
    convertPixelsToDp(wwidth, getApplicationContext());
//    Toast.makeText(getApplicationContext(), height+ "= "+convertPixelsToDp(height, getApplicationContext()) + 
//          "   " + wwidth+ "= "+convertPixelsToDp(wwidth, getApplicationContext()), Toast.LENGTH_LONG).show();
   //scroll view 1 screen height size
    scr1 = (ScrollView) findViewById(R.id.ScrollView01);
    scr1.getLayoutParams().height=height - 200; 
于 2012-10-16T08:59:09.720 回答
0

将图像视图放在线性布局中。给每个图像视图赋予权重..它会按比例增加大小..

于 2012-10-16T09:27:19.463 回答