Hello有用的stackoverflow成员,
我正在尝试在Android活动中完成看似简单的布局,但我似乎无法使用wrap_content和fill_parent / match_parent进行工作。
图片给出了问题的基本概念: http://i89.photobucket.com/albums/k207/cephron/Layout_quandary.png
在垂直的LinearLayout中,我有一个包含按钮和东西的子布局顶部的ImageView。 我想要扩展ImageView以使图像尽可能大(即填充屏幕宽度),而不需要占用更多的垂直空间来实现这一点(即我希望ImageView触及顶部)屏幕,按钮和东西触摸图像的底部)。 我无法使用wrap_content和fill_parent来实现这一点,而且我所有与引力的混乱似乎都没有改变任何东西。我必须包括权重,以确保图像不会完全脱离屏幕上的所有其他内容。
我很想发布正确的代码,但是 - 我是noob - 我浪费了大约20分钟试图让它与Stackoverflow的代码格式化程序一起使用,并且部分代码格式化程序不会显示。
所以,这是我的代码,它被充分破坏,以至于无法通过选择性删除部分内容来识别它:
[LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"]
[ImageView android:id="@+id/door_detail_video_frame"
android:src="@drawable/door_closed_256"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"/]
[LinearLayout android:id="@+id/door_detail_control_area"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"]
[ImageView android:id="@+id/door_detail_status_frame"
android:src="@drawable/door_closed_locked_67"
android:layout_width="wrap_content"
android:layout_height="fill_parent"/]
[LinearLayout android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_width="fill_parent"]
[Button android:id="@+id/door_detail_override_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/door_detail_override_button_text"/]
[Button android:id="@+id/door_detail_camera_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/door_detail_camera_button_text"/]
[/LinearLayout]
[/LinearLayout]
[/LinearLayout]
我相信唯一相关的部分是第一个LinearLayout和ImageView,但是嵌套布局中的东西(对应于“按钮和东西”)是为了完整性而包含的。
有没有办法实现所需的布局格式?
提前感谢您的帮助!
答案 0 :(得分:8)
未经测试,这可能会有所帮助。我之前尝试过这种事情,似乎比应该更难:
ImageView iv = (ImageView)findViewById(R.id.door_detail_video_frame);
ViewTreeObserver vto = iv.getViewTreeObserver();
//gets screen dimensions
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//this happens before the layout is visible
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int newWidth, newHeight, oldHeight, oldWidth;
//the new width will fit the screen
newWidth = metrics.widthPixels;
//so we can scale proportionally
oldHeight = iv.getDrawable().getIntrinsicHeight();
oldWidth = iv.getDrawable().getIntrinsicWidth();
newHeight = Math.floor((oldHeight * newWidth) / oldWidth);
iv.setLayoutParams(new LinearLayout.LayoutParams(newWidth, newHeight));
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
//so this only happens once
iv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
提示SO的代码格式化程序:只需将代码复制并粘贴到窗口中,选择全部,然后按Ctrl + K.