Android: How to Programmatically set the size of a Layout

AndroidLayoutResizeAndroid Linearlayout

Android Problem Overview


As part of an Android App I am building a button set. The buttons are part of a nested set of LinearLayouts. Using weight I have the set resizing itself automatically based on the size of the containing parent LinearLayout. The idea is, based on the pixel count and density of the screen, to set the size of the containing layout to a number of pixels; and have the button set resize itself based on that change.

The question then is: How to resize the layout.

I have tried several suggested techniques, and none come close to working. Here is a subset of the XML that builds the button set:

	<LinearLayout android:layout_height="104pt" android:id="@+id/numberPadLayout" android:orientation="horizontal" android:layout_width="104pt"
   	android:background="#a0a0a0"
	android:layout_alignParentBottom="true" 
	android:layout_centerHorizontal="true"
>

    <LinearLayout android:layout_weight="2" android:layout_height="fill_parent" android:id="@+id/linearLayout1" android:orientation="vertical" android:layout_width="wrap_content">
        <Button android:text="1" android:id="@+id/button1" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="4" android:id="@+id/button4" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="7" android:id="@+id/button7" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="-" android:id="@+id/buttonDash" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    </LinearLayout>
    <LinearLayout android:layout_weight="2" android:layout_height="fill_parent" android:id="@+id/linearLayout2" android:orientation="vertical" android:layout_width="wrap_content">
        <Button android:text="2" android:id="@+id/button2" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="5" android:id="@+id/button5" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="8" android:id="@+id/button8" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="0" android:id="@+id/button0" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    </LinearLayout>
 
    <LinearLayout android:layout_weight="2" android:layout_height="fill_parent" android:id="@+id/linearLayout3" android:orientation="vertical" android:layout_width="wrap_content">
        <Button android:text="3" android:id="@+id/button3" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="6" android:id="@+id/button6" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="9" android:id="@+id/button9" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="." android:id="@+id/buttonDot" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    </LinearLayout>
    <LinearLayout android:layout_weight="2" android:layout_height="fill_parent" android:id="@+id/linearLayout4" android:orientation="vertical" android:layout_width="wrap_content">
        <Button android:text="/" android:id="@+id/buttonBack" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
        <Button android:text="\" android:id="@+id/buttonEnter" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
    </LinearLayout>

</LinearLayout>    

The two questions are: 1) how do I get access to numberPadLayout from Java. And once I have access to the view, 2) how do I change the height and width of the layout.

Any suggestions will be appreciated.

Android Solutions


Solution 1 - Android

Java

This should work:

// Gets linearlayout
LinearLayout layout = findViewById(R.id.numberPadLayout);
// Gets the layout params that will allow you to resize the layout
LayoutParams params = layout.getLayoutParams();
// Changes the height and width to the specified *pixels*
params.height = 100;
params.width = 100;
layout.setLayoutParams(params);

If you want to convert dip to pixels, use this:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());

Kotlin

Solution 2 - Android

my sample code

wv = (WebView) findViewById(R.id.mywebview);
wv.getLayoutParams().height = LayoutParams.MATCH_PARENT; // LayoutParams: android.view.ViewGroup.LayoutParams
// wv.getLayoutParams().height = LayoutParams.WRAP_CONTENT;
wv.requestLayout();//It is necesary to refresh the screen

Solution 3 - Android

LinearLayout YOUR_LinearLayout =(LinearLayout)findViewById(R.id.YOUR_LinearLayout)
    LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
                       /*width*/ ViewGroup.LayoutParams.MATCH_PARENT,
               /*height*/ 100,
               /*weight*/ 1.0f
                );
                YOUR_LinearLayout.setLayoutParams(param);

Solution 4 - Android

You can get the actual height of called layout with this code:

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();
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncodingCatView Question on Stackoverflow
Solution 1 - AndroidA. AbiriView Answer on Stackoverflow
Solution 2 - Androidvuhung3990View Answer on Stackoverflow
Solution 3 - AndroidKapil ParmarView Answer on Stackoverflow
Solution 4 - AndroidsmartmouseView Answer on Stackoverflow