PercentLayoutHelper
public
class
PercentLayoutHelper
extends Object
| java.lang.Object | |
| ↳ | androidx.percentlayout.widget.PercentLayoutHelper |
This class is deprecated.
consider using ConstraintLayout and associated layouts instead. The following shows
how to replicate the functionality of percentage layouts with a ConstraintLayout. The Guidelines
are used to define each percentage break point, and then a Button view is stretched to fill
the gap:
<androidx.constraintlayout.widget.ConstraintLayout
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">
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/left_guideline"
app:layout_constraintGuide_percent=".15"
android:orientation="vertical"/>
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/right_guideline"
app:layout_constraintGuide_percent=".85"
android:orientation="vertical"/>
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/top_guideline"
app:layout_constraintGuide_percent=".15"
android:orientation="horizontal"/>
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bottom_guideline"
app:layout_constraintGuide_percent=".85"
android:orientation="horizontal"/>
<Button
android:text="Button"
android:layout_width="0dp"
android:layout_height="0dp"
android:id="@+id/button"
app:layout_constraintLeft_toLeftOf="@+id/left_guideline"
app:layout_constraintRight_toRightOf="@+id/right_guideline"
app:layout_constraintTop_toTopOf="@+id/top_guideline"
app:layout_constraintBottom_toBottomOf="@+id/bottom_guideline" />
</androidx.constraintlayout.widget.ConstraintLayout>
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.LayoutParams subclass in your ViewGroup that implements
PercentLayoutHelper.PercentLayoutParams.
- In your
LayoutParams(Context c, AttributeSet attrs) constructor create an instance
of PercentLayoutHelper.PercentLayoutInfo by calling
getPercentLayoutInfo(Context, AttributeSet). Return this
object from public PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo()
method that you implemented for PercentLayoutHelper.PercentLayoutParams interface.
- Override
ViewGroup.LayoutParams.setBaseAttributes(TypedArray, int, int)
with a single line implementation PercentLayoutHelper.fetchWidthAndHeight(this, a,
widthAttr, heightAttr);
- In your ViewGroup override
ViewGroup.generateLayoutParams(AttributeSet) to return
your LayoutParams.
- In your
View.onMeasure(int, int) override, 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
ViewGroup.onLayout(boolean, int, int, int, int) override, 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 classes | |
|---|---|
class |
PercentLayoutHelper.PercentLayoutInfo
This class is deprecated. use ConstraintLayout and Guidelines for layout support. |
interface |
PercentLayoutHelper.PercentLayoutParams
This interface is deprecated. this class is deprecated along with its parent class. |
Public constructors | |
|---|---|
PercentLayoutHelper(ViewGroup host)
|
|
Public methods | |
|---|---|
void
|
adjustChildren(int widthMeasureSpec, int heightMeasureSpec)
Iterates over children and changes their width and height to one calculated from percentage values. |
static
void
|
fetchWidthAndHeight(ViewGroup.LayoutParams params, TypedArray array, int widthAttr, int heightAttr)
Helper method to be called from |
static
PercentLayoutHelper.PercentLayoutInfo
|
getPercentLayoutInfo(Context context, AttributeSet attrs)
Constructs a PercentLayoutInfo from attributes associated with a View. |
boolean
|
handleMeasuredStateTooSmall()
Iterates over children and checks if any of them would like to get more space than it received through the percentage dimension. |
void
|
restoreOriginalParams()
Iterates over children and restores their original dimensions that were changed for percentage values. |
Inherited methods | |
|---|---|
Public constructors
Public methods
adjustChildren
public void adjustChildren (int widthMeasureSpec,
int heightMeasureSpec)
Iterates over children and changes their width and height to one calculated from percentage values.
| Parameters | |
|---|---|
widthMeasureSpec |
int: Width MeasureSpec of the parent ViewGroup. |
heightMeasureSpec |
int: Height MeasureSpec of the parent ViewGroup.
|
fetchWidthAndHeight
public static void fetchWidthAndHeight (ViewGroup.LayoutParams params, TypedArray array, int widthAttr, int heightAttr)
Helper method to be called from ViewGroup.LayoutParams.setBaseAttributes(TypedArray, int, int) override
that reads layout_width and layout_height attribute values without throwing an exception if
they aren't present.
| Parameters | |
|---|---|
params |
ViewGroup.LayoutParams |
array |
TypedArray |
widthAttr |
int |
heightAttr |
int |
getPercentLayoutInfo
public static PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo (Context context, AttributeSet attrs)
Constructs a PercentLayoutInfo from attributes associated with a View. Call this method from
LayoutParams(Context c, AttributeSet attrs) constructor.
| Parameters | |
|---|---|
context |
Context |
attrs |
AttributeSet |
| Returns | |
|---|---|
PercentLayoutHelper.PercentLayoutInfo |
|
handleMeasuredStateTooSmall
public boolean handleMeasuredStateTooSmall ()
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. |
restoreOriginalParams
public void restoreOriginalParams ()
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(int, int).
Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2020-09-30 UTC.