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
我想要的是:

  • 在视图B中插入两个视图A时:
    • 我想把这两个视图延伸到100 dp。因此,B将是具有2个子项的常见线性布局
  • 在视图B中插入5个视图A时:
    • 我想将滚动视图添加到B中。所有5个视图A都将在此滚动视图中,并且它们的高度将为50 dp
  • 通常,我会在构造函数中将视图添加到自定义视图中。但我不能在这里做,因为我不知道构造器中B的高度。我只知道A的高度。所以请建议我应该使用哪种回调方法…当B的高度已知时,我可以根据此高度添加所有子视图

    或者如果你知道任何其他方法…请让我知道


    多谢各位

    > 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()方法获得高度,并根据该值选择布局。但我不知道在哪个视图中使用方法。好的,我理解。要获取每个视图的高度,可以使用以下方法: