PercentLayoutHelper
class PercentLayoutHelper
Helper for layouts that want to support percentage based dimensions.
This class collects utility methods that are involved in extracting percentage based dimension attributes and applying them to ViewGroup's children. If you would like to implement a layout that supports percentage based dimensions, you need to take several steps:
- You need a
ViewGroup.LayoutParamssubclass in your ViewGroup that implementsPercentLayoutHelper.PercentLayoutParams. - In your
LayoutParams(Context c, AttributeSet attrs)constructor create an instance ofPercentLayoutHelper.PercentLayoutInfoby callinggetPercentLayoutInfo. Return this object frompublic PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo()method that you implemented forPercentLayoutHelper.PercentLayoutParamsinterface. - Override
setBaseAttributeswith a single line implementationPercentLayoutHelper.fetchWidthAndHeight(this, a, widthAttr, heightAttr); - In your ViewGroup override
generateLayoutParamsto return your LayoutParams. - In your
onMeasureoverride, you need to implement following pattern:protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { mHelper.adjustChildren(widthMeasureSpec, heightMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mHelper.handleMeasuredStateTooSmall()) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
- In your
onLayoutoverride, you need to implement following pattern:protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); mHelper.restoreOriginalParams(); }
Summary
Nested types |
|---|
|
This class is deprecated. use ConstraintLayout and Guidelines for layout support. |
interface PercentLayoutHelper.PercentLayoutParamsThis interface is deprecated. this class is deprecated along with its parent class. |
Public constructors |
|---|
|
Public functions |
|
|---|---|
Unit |
Iterates over children and changes their width and height to one calculated from percentage values. |
java-static Unit |
Helper method to be called from |
java-static PercentLayoutHelper.PercentLayoutInfo! |
Constructs a PercentLayoutInfo from attributes associated with a View. |
Boolean |
Iterates over children and checks if any of them would like to get more space than it received through the percentage dimension. |
Unit |
Iterates over children and restores their original dimensions that were changed for percentage values. |
Public constructors
Public functions
funadjustChildren(widthMeasureSpec: Int, heightMeasureSpec: Int): Unit
Iterates over children and changes their width and height to one calculated from percentage values.
java-static funfetchWidthAndHeight(
params: ViewGroup.LayoutParams!,
array: TypedArray!,
widthAttr: Int,
heightAttr: Int
): Unit
Helper method to be called from setBaseAttributes override that reads layout_width and layout_height attribute values without throwing an exception if they aren't present.
java-static fungetPercentLayoutInfo(context: Context!, attrs: AttributeSet!): PercentLayoutHelper.PercentLayoutInfo!
Constructs a PercentLayoutInfo from attributes associated with a View. Call this method from LayoutParams(Context c, AttributeSet attrs) constructor.
funhandleMeasuredStateTooSmall(): Boolean
Iterates over children and checks if any of them would like to get more space than it received through the percentage dimension. If you are building a layout that supports percentage dimensions you are encouraged to take advantage of this method. The developer should be able to specify that a child should be remeasured by adding normal dimension attribute with wrap_content value. For example he might specify child's attributes as app:layout_widthPercent="60%p" and android:layout_width="wrap_content". In this case if the child receives too little space, it will be remeasured with width set to WRAP_CONTENT.
| Returns | |
|---|---|
Boolean |
True if the measure phase needs to be rerun because one of the children would like to receive more space. |
funrestoreOriginalParams(): Unit
Iterates over children and restores their original dimensions that were changed for percentage values. Calling this method only makes sense if you previously called adjustChildren.