我正在尝试使用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);
}
}
答案 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时,一切都按照我原先预期的方式工作......