【问题标题】:Define maximum RelativeLayout size定义最大相对布局大小
【发布时间】:2012-10-26 07:57:40
【问题描述】:

我必须在屏幕上定义 5 个布局,并将它们像 3x3 网格一样放置。布局为空。

在某些时候,我想以编程方式在一个布局上添加一些视图,并且该视图不能超过分配的布局大小。换句话说,我希望有一个可以放置任何视图的布局,并且可以保证它不会在该布局上增长。重要提示:我无权手动更改添加视图的大小,我只能控制其最大大小。

我现在有这样的布局:

<RelativeLayout
    android:id="@+id/pluginsLayout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"     
    android:layout_above="@+id/mainButtons"
    android:layout_below="@+id/paramsLayout">
        <RelativeLayout
            android:id="@+id/capturingPluginLayout"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"           
            android:layout_gravity="fill_horizontal|left"
            android:layout_above="@+id/processingPluginLayout">                                         
        </RelativeLayout>
        <RelativeLayout
            android:id="@+id/processingPluginLayout"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"               
            android:layout_gravity="fill_horizontal|left"
            android:layout_above="@+id/filterPluginLayout">                                     
        </RelativeLayout>
        <RelativeLayout
            android:id="@+id/filterPluginLayout"
            android:orientation="vertical"
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_weight="1"
            android:layout_gravity="fill_horizontal|left|bottom"                
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true">                                  
        </RelativeLayout>
        <RelativeLayout
            android:id="@+id/exportPluginLayout"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"               
            android:layout_gravity="fill_horizontal|right"
            android:layout_above="@+id/viewfinderPluginLayout">                                     
        </RelativeLayout>
        <RelativeLayout
            android:id="@+id/viewfinderPluginLayout"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"                                       
            android:layout_gravity="fill_horizontal|bottom|right"
            android:layout_toLeftOf="@+id/filterPluginLayout"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true">                                     
        </RelativeLayout>
    </RelativeLayout>

我在代码中添加了新视图:

public void addVFPluginView(View view)
{       
    ((RelativeLayout)MainScreen.thiz.findViewById(R.id.viewfinderPluginLayout)).addView(view);      
}

我希望得到这样的行为:

但我只有这个,视图填充整个父布局:

注意:我使用 API8(没有 GridLayout)

【问题讨论】:

    标签: android android-layout android-relativelayout


    【解决方案1】:

    你可以在 API8 中使用网格布局。

    【讨论】:

    • 哦..你是对的...为什么我在记忆中还有其他的东西? ) 将尝试网格!
    【解决方案2】:

    我已经设法解决了这个问题。 主要思想是我自己以编程方式控制视图的大小。 我为每个区域计算适当的比例,当有人向其中的某些布局添加新视图时,我会检查此视图的大小是否适合分配的布局大小。如果尺寸不合适,我会为此视图修改 LayoutParams。 这是空布局的xml:

    <RelativeLayout
        android:id="@+id/pluginsLayout"             
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"             
        android:layout_above="@+id/mainButtons"
        android:layout_below="@+id/paramsLayout">
            <LinearLayout
                android:id="@+id/capturePluginLayout"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"                
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true">               
            </LinearLayout>
            <LinearLayout
                android:id="@+id/processingPluginLayout"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"                
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true">                                           
            </LinearLayout>
            <LinearLayout
                android:id="@+id/filterPluginLayout"
                android:orientation="vertical"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"                
                android:layout_alignParentLeft="true"
                android:layout_alignParentBottom="true">                                            
            </LinearLayout>
            <LinearLayout
                android:id="@+id/exportPluginLayout"
                android:orientation="vertical"              
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true">                                               
            </LinearLayout>
            <RelativeLayout
                android:id="@+id/viewfinderPluginLayout"
                android:orientation="vertical"
                android:layout_width="wrap_content"             
                android:layout_height="wrap_content"                                        
                android:layout_alignParentRight="true"
                android:layout_alignParentBottom="true">                                                        
            </RelativeLayout>
        </RelativeLayout>
    

    像这样我管理添加视图的大小:

    public void addVFPluginView(View view)
    {
        //Get maximum width and height for such plugins
        int layoutHeight = this.getViewfinderLayoutHeight();
        int layoutWidth = this.getViewfinderLayoutWidth();
    
        //Calculate appropriate size of added plugin's view
        android.widget.RelativeLayout.LayoutParams viewLayoutParams = (android.widget.RelativeLayout.LayoutParams)view.getLayoutParams();
        viewLayoutParams = this.getTunedRelativeLayoutParams(view, viewLayoutParams, layoutWidth, layoutHeight);
    
    //Get fixed maximum size for this plugin type
    public int getViewfinderLayoutWidth()
    {
        return ((RelativeLayout)MainScreen.thiz.findViewById(R.id.pluginsLayout)).getWidth()/2;
    }
    
    public int getViewfinderLayoutHeight()
    {
        return (int)(((RelativeLayout)MainScreen.thiz.findViewById(R.id.pluginsLayout)).getHeight()*0.7);
    }
    
    
        ((RelativeLayout)MainScreen.thiz.findViewById(R.id.viewfinderPluginLayout)).addView(view, viewLayoutParams);        
    }
    
    android.widget.RelativeLayout.LayoutParams getTunedRelativeLayoutParams(View view, android.widget.RelativeLayout.LayoutParams currParams, int goodWidth, int goodHeight)
    {
        int viewHeight, viewWidth;
    
        if(currParams != null)
        {
            viewHeight = currParams.height;
            viewWidth = currParams.width;
    
    
            if(viewHeight > goodHeight || viewHeight <= 0)
                viewHeight = goodHeight;
    
            if(viewWidth > goodWidth || viewWidth <= 0)
                viewWidth = goodWidth;
    
            currParams.width = viewWidth;
            currParams.height = viewHeight;
    
            view.setLayoutParams(currParams);
        }
        else
        {       
            currParams = new android.widget.RelativeLayout.LayoutParams(goodWidth, goodHeight);
            view.setLayoutParams(currParams);
        }
    
        return currParams;
    }
    

    最后,下一个问题是几个大小合适的视图,但总的来说它们大于分配的大小。也许我会直接计算视图的大小,如果与下一个添加视图的大小的总和超过分配的大小,我就不允许添加这个视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多