显示图像时,ImageView会展开

时间:2011-08-07 19:33:18

标签: android android-layout android-widget

我正在尝试使用10个相等高度的行进行布局,每行包含一个ImageView和一个TextView。当我将图像放入ImageView时,我希望它可以缩放以保持相同的方面并适合ImageView,而不是更改ImageView大小或包含TableRow的高度。

我遇到的问题是,当我将图像加载到ImageView中时,ImageView似乎会扩展,它也会改变TableRow(?)的高度我已经看了一段时间了,但可以'似乎让它发挥作用。我可能错过了Android布局或ImageView如何工作的细节(?)

我从我的代码中创建了一个较小的示例来展示问题。我还在ImageView上设置了背景颜色,因此更容易看到它改变大小。

下面是我的布局文件和代码(格式化道歉,我还将完整的Eclipse项目放在http://dl.dropbox.com/u/28937795/ImageRowSample.zip

任何帮助将不胜感激。 =)

MAIN.XML

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>



<TableRow style="@style/SlashRowStyle">
    <ImageView style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="0" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <ImageView style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="1" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <!-- I'm setting the background of this ImageView 
                 so it's easier to see it change size -->
    <ImageView android:id="@+id/image2" style="@style/SlashViewStyle" 
               android:background="#FF0000"/>
    <TextView  style="@style/NumberViewStyle" android:text="2" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <ImageView style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="3" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <ImageView style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="4" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <ImageView style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="5" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <ImageView style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="6" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <ImageView style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="7" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <ImageView style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="8" />
</TableRow>

<TableRow style="@style/SlashRowStyle">
    <ImageView  style="@style/SlashViewStyle" />
    <TextView  style="@style/NumberViewStyle" android:text="9" />
</TableRow>


<LinearLayout style="@style/ButtonBarStyle" >
    <Button android:text="Add Image" android:onClick="onClickedAddImage" 
            android:gravity="center" android:layout_width="0dip"
            android:layout_height="fill_parent" android:layout_weight="1" />

    <Button android:text="Clear Image" android:onClick="onClickedClearImage"  
            android:gravity="center" android:layout_width="0dip" 
            android:layout_height="fill_parent" android:layout_weight="1" />
</LinearLayout>

</TableLayout>

STYLES.XML
<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="SlashRowStyle" >
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">0dip</item>
    <item name="android:layout_weight">1</item>
    <item name="android:gravity">center</item>
</style>

<style name="SlashViewStyle" >
    <!--  I want scaling so it fits in the Imageview with the same aspect. 
          I tried both fitCenter and centerInside   -->
    <item name="android:scaleType">fitCenter</item>
    <item name="android:layout_width">0dip</item>
    <item name="android:layout_height">fill_parent</item>
    <item name="android:layout_weight">40</item>
    <item name="android:gravity">center</item>       
</style>

<style name="NumberViewStyle">
    <item name="android:layout_width">0dip</item>
    <item name="android:layout_height">fill_parent</item>
    <item name="android:layout_weight">60</item>
    <item name="android:gravity">center</item>       

    <item name="android:typeface">sans</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">20sp</item>
    <item name="android:textColor">#0000FF</item>
</style>


<style name="ButtonBarStyle">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:orientation">horizontal</item>
    <item name="android:background">#404040</item>
    <item name="android:paddingTop">5dip</item>
</style>

</resources>

IMAGEROWSAMPLEACTIVITY.JAVA

public class ImageRowSampleActivity extends Activity {

private ImageView _iv;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    _iv = (ImageView)findViewById(R.id.image2);
}



public void onClickedAddImage(View v) {
    _iv.setImageResource(R.drawable.x);
}



public void onClickedClearImage(View v) {
    //_iv.setImageResource(0);      //Tried this also
    _iv.setImageDrawable(null);
}

}

1 个答案:

答案 0 :(得分:1)

在看了一些之后我终于找到了答案。

问题是TableLayout中的TableRows。 Android SDK TableLayout doc说明了

  

TableLayout的子节点无法指定layout_width属性。宽度总是如此   MATCH_PARENT。但是,layout_height属性可以由子项定义;默认值   是WRAP_CONTENT。如果孩子是TableRow,那么身高始终是WRAP_CONTENT。

TableRow文档也说

  

TableRow的子节点不需要指定layout_width和layout_height   XML文件中的属性。 TableRow始终分别强制执行这些值   MATCH_PARENT和WRAP_CONTENT。

所以,是的,问题是TableRows总是忽略我的设置并将其高度设为WRAP_CONTENT,然后还强制ImageView的高度为WRAP_CONTENT。当我使用正确的方向将TableLayout和TableRows转换为LinearLayouts时,一切都按照我原先预期的方式工作......