0

画面上に 5 つのレイアウトを定義し、それらを 3x3 グリッドのように配置する必要があります。レイアウトが空です。 ここに画像の説明を入力

ある時点で、プログラムで 1 つのレイアウトにいくつかのビューを追加したいのですが、そのビューは割り当てられたレイアウトのサイズを超えてはなりません。言い換えれば、ビューを配置するレイアウトが必要であり、そのレイアウトを超えて拡大しないことが保証されます。重要な注意: 追加されたビューのサイズを手動で変更する権利はありません。最大サイズを制御することしかできません。

私は今そのようなレイアウトを持っています:

<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

私はこの問題を解決することができました。主なアイデアは、ビューのサイズをプログラムで自分で制御することでした。各ゾーンの適切な比率を計算し、誰かがこのレイアウトの一部に新しいビューを追加するときに、割り当てられたレイアウト サイズに対するこのビューのサイズの適合性をチェックします。サイズが適切でない場合は、このビューの 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 に答える
0

API8 でグリッド レイアウトを使用できます。

于 2012-10-26T09:11:12.860 に答える