Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

PercentRelativeLayout

open class PercentRelativeLayout : RelativeLayout
kotlin.Any
   ↳ android.view.View
   ↳ android.view.ViewGroup
   ↳ android.widget.RelativeLayout
   ↳ androidx.percentlayout.widget.PercentRelativeLayout

Subclass of android.widget.RelativeLayout that supports percentage based dimensions and margins. You can specify dimension or a margin of child by using attributes with "Percent" suffix. Follow this example:

<androidx.percentlayout.widget.PercentRelativeLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
      <ImageView
          app:layout_widthPercent="50%"
          app:layout_heightPercent="50%"
          app:layout_marginTopPercent="25%"
          app:layout_marginLeftPercent="25%"/>
  </androidx.percentlayout.widget.PercentRelativeLayout>
  
The attributes that you can use are:
  • layout_widthPercent
  • layout_heightPercent
  • layout_marginPercent
  • layout_marginLeftPercent
  • layout_marginTopPercent
  • layout_marginRightPercent
  • layout_marginBottomPercent
  • layout_marginStartPercent
  • layout_marginEndPercent
  • layout_aspectRatio
It is not necessary to specify layout_width/height if you specify layout_widthPercent. However, if you want the view to be able to take up more space than what percentage value permits, you can add layout_width/height="wrap_content". In that case if the percentage size is too small for the View's content, it will be resized using wrap_content rule.

You can also make one dimension be a fraction of the other by setting only width or height and using layout_aspectRatio for the second one to be calculated automatically. For example, if you would like to achieve 16:9 aspect ratio, you can write:

android:layout_width="300dp"
      app:layout_aspectRatio="178%"
  
This will make the aspect ratio 16:9 (1.78:1) with the width fixed at 300dp and height adjusted accordingly.

Summary

Nested classes

open

Public constructors

<init>(context: Context!)

<init>(context: Context!, attrs: AttributeSet!)

<init>(context: Context!, attrs: AttributeSet!, defStyle: Int)

Public methods

open PercentRelativeLayout.LayoutParams!

Protected methods

open PercentRelativeLayout.LayoutParams!

open Unit
onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int)

open Unit
onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)

Public constructors

<init>

PercentRelativeLayout(context: Context!)

<init>

PercentRelativeLayout(context: Context!, attrs: AttributeSet!)

<init>

PercentRelativeLayout(context: Context!, attrs: AttributeSet!, defStyle: Int)

Public methods

generateLayoutParams

open fun generateLayoutParams(attrs: AttributeSet!): PercentRelativeLayout.LayoutParams!

Protected methods

generateDefaultLayoutParams

protected open fun generateDefaultLayoutParams(): PercentRelativeLayout.LayoutParams!

onLayout

protected open fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int): Unit

onMeasure

protected open fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int): Unit