0

我必须在屏幕上定义 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)

4

2 回答 2

0

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

于 2012-10-26T09:11:12.860 回答
0

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

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

于 2012-10-30T09:07:04.287 回答