Android:如何根据大小创建自定义布局
我需要一个建议…我想创建一个自定义视图组,该组将根据此视图的大小具有不同的布局 一个例子: 两种观点:Android:如何根据大小创建自定义布局,android,layout,view,Android,Layout,View,我需要一个建议…我想创建一个自定义视图组,该组将根据此视图的大小具有不同的布局 一个例子: 两种观点: 视图A:高度至少为50dp的子视图 视图B:我的自定义视图,它延伸到垂直方向的线性布局,高度为200 dp 我想要的是: 在视图B中插入两个视图A时: 我想把这两个视图延伸到100 dp。因此,B将是具有2个子项的常见线性布局 在视图B中插入5个视图A时: 我想将滚动视图添加到B中。所有5个视图A都将在此滚动视图中,并且它们的高度将为50 dp 通常,我会在构造函数中将视图添加到自
- 视图A:高度至少为50dp的子视图
- 视图B:我的自定义视图,它延伸到垂直方向的线性布局,高度为200 dp
- 我想把这两个视图延伸到100 dp。因此,B将是具有2个子项的常见线性布局
- 我想将滚动视图添加到B中。所有5个视图A都将在此滚动视图中,并且它们的高度将为50 dp
多谢各位 > P>你应该考虑把所有视图放进一个垂直滚动的线性布局中,或者更好的是:使用一个ListVIEW代替布局和滚动视图。
原因是,如果需要,它将根据屏幕上的可用空间和视图大小自动处理滚动。您可以使用此代码获取主布局的实际高度。 然后,您可以在if-else或switch case块中使用该高度来检查所需的条件
public int getLayoutSize() {
// Get the layout id
final LinearLayout root = (LinearLayout) findViewById(R.id.mainroot);
final AtomicInteger layoutHeight = new AtomicInteger();
root.post(new Runnable() {
public void run() {
Rect rect = new Rect();
Window win = getWindow(); // Get the Window
win.getDecorView().getWindowVisibleDisplayFrame(rect);
// Get the height of Status Bar
int statusBarHeight = rect.top;
// Get the height occupied by the decoration contents
int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop();
// Calculate titleBarHeight by deducting statusBarHeight from contentViewTop
int titleBarHeight = contentViewTop - statusBarHeight;
Log.i("MY", "titleHeight = " + titleBarHeight + " statusHeight = " + statusBarHeight + " contentViewTop = " + contentViewTop);
// By now we got the height of titleBar & statusBar
// Now lets get the screen size
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int screenHeight = metrics.heightPixels;
int screenWidth = metrics.widthPixels;
Log.i("MY", "Actual Screen Height = " + screenHeight + " Width = " + screenWidth);
// Now calculate the height that our layout can be set
// If you know that your application doesn't have statusBar added, then don't add here also. Same applies to application bar also
layoutHeight.set(screenHeight - (titleBarHeight + statusBarHeight));
Log.i("MY", "Layout Height = " + layoutHeight);
// Lastly, set the height of the layout
FrameLayout.LayoutParams rootParams = (FrameLayout.LayoutParams)root.getLayoutParams();
rootParams.height = layoutHeight.get();
root.setLayoutParams(rootParams);
}
});
return layoutHeight.get();
}
如果B的高度应该是常量,那么只需检查孩子A的普通高度即可。如果聚合高度大于200(或4+个视图)-在B内部创建一个ScrollView并将a视图推入其中,然后通过编程将ScrollView的布局参数设置为与父视图匹配。否则(如果一个视图只有1-3)-将它们的layou_weight参数设置为1。这正是我想要的。但我不知道什么时候会知道值200,即覆盖哪个方法。B的高度不是常数高度,而是取决于屏幕大小。正如我写的:这个值在构造函数中是未知的。。。谢谢你的回复…不幸的是,这不是你想要的行为。我想在不需要scrollview时拉伸子视图…即。当内部视图的聚合大小较小时,我将使用权重;当大小较大时,我将使用scrollview。我不知道listview和SimpleScrollView是如何实现的。顺便说一句,布局会比我的例子复杂一点。它将是一个具有多列的表格布局。。这就是为什么我不想使用listview。但是android支持很多屏幕分辨率和密度。您应该考虑如何处理不同的配置,以便使用所需的布局。即使使用权重,也需要检查视图是否有足够的空间显示其内容。你会怎么做?当然我知道…这就是我想使用这个自定义布局的原因。当屏幕/分辨率足够大时,或者当您只是将设备dpi更改为较低的值时,内容很小,并且当它不是全屏时(它只占据屏幕的一部分)看起来不好…所以我想使用权重来拉伸它。另一方面,当屏幕很小时,我必须使用scrollview。我将如何区分这两种情况?这就是我在这里要问的:)我想通过getHeight()方法获得高度,并根据该值选择布局。但我不知道在哪个视图中使用方法。好的,我理解。要获取每个视图的高度,可以使用以下方法: