Android
layout
Ricerca…
introduzione
Un layout definisce la struttura visiva per un'interfaccia utente, come un'attività o un widget.
Un layout è dichiarato in XML, inclusi gli elementi dello schermo che appariranno in esso. Il codice può essere aggiunto all'applicazione per modificare lo stato degli oggetti dello schermo in fase di runtime, compresi quelli dichiarati in XML.
Sintassi
- Android: la gravità = "top | bottom | left | right | center_vertical | fill_vertical | center_horizontal | fill_horizontal | centro | riempire | clip_vertical | clip_horizontal | Inizio | fine"
- Android: layout_gravity = "top | bottom | left | right | center_vertical | fill_vertical | center_horizontal | fill_horizontal | centro | riempire | clip_vertical | clip_horizontal | Inizio | fine"
Osservazioni
LayoutParams e Layout_ Attributes
Impatto sulle prestazioni dall'uso di RelativeLayouts nella parte superiore della gerarchia della vista
Come spiegato in questo articolo sulle prestazioni in Android , un RelativeLayout
richiede due passaggi di layout per il rendering corretto. Per le gerarchie di viste complesse, ciò può avere un impatto significativo sulle prestazioni. Nesting RelativeLayouts
rende questo problema ancora peggiore, perché ogni RelativeLayout
fa aumentare il numero di passaggi di layout.
LinearLayout
LinearLayout è un ViewGroup
che organizza i suoi figli in una singola colonna o una singola riga. L'orientamento può essere impostato chiamando il metodo setOrientation()
o usando l'attributo xml android:orientation
.
- Orientamento verticale :
android:orientation="vertical"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@android:string/cancel" />
</LinearLayout>
Ecco uno screenshot di come apparirà questo:
Orientamento orizzontale :
android:orientation="horizontal"
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/app_name" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@android:string/cancel" />
LinearLayout
supporta anche l'assegnazione di un peso ai singoli bambini con l'attributo android:layout_weight
.
RelativeLayout
RelativeLayout
è un ViewGroup
che visualizza viste ViewGroup
in posizioni relative. Per impostazione predefinita, tutte le viste child vengono disegnate nella parte in alto a sinistra del layout, quindi è necessario definire la posizione di ciascuna vista utilizzando le varie proprietà di layout disponibili da RelativeLayout.LayoutParams
. Il valore per ogni proprietà di layout è o un valore booleano per abilitare una posizione di layout relativa a RelativeLayout padre o un ID che fa riferimento a un'altra vista nel layout rispetto alla quale deve essere posizionata la vista.
Esempio:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@mipmap/ic_launcher" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_toRightOf="@+id/imageView"
android:layout_toEndOf="@+id/imageView"
android:hint="@string/hint" />
</RelativeLayout>
Ecco uno screenshot di come apparirà questo:
Gravità e gravità del layout
Android: layout_gravity
-
android:layout_gravity
è usato per impostare la posizione di un elemento nel suo genitore (ad esempio, unaView
un bambino all'interno di unLayout
). - Supportato da LinearLayout e FrameLayout
Android: la gravità
-
android:gravity
viene utilizzata per impostare la posizione del contenuto all'interno di un elemento (ad es. un testo all'interno di unaTextView
).
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical"
android:layout_gravity="left"
android:gravity="center_vertical">
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/first"
android:background="@color/colorPrimary"
android:gravity="left"/>
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/second"
android:background="@color/colorPrimary"
android:gravity="center"/>
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/third"
android:background="@color/colorPrimary"
android:gravity="right"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical"
android:layout_gravity="center"
android:gravity="center_vertical">
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/first"
android:background="@color/colorAccent"
android:gravity="left"/>
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/second"
android:background="@color/colorAccent"
android:gravity="center"/>
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/third"
android:background="@color/colorAccent"
android:gravity="right"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical"
android:layout_gravity="right"
android:gravity="center_vertical">
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/first"
android:background="@color/colorPrimaryDark"
android:gravity="left"/>
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/second"
android:background="@color/colorPrimaryDark"
android:gravity="center"/>
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/third"
android:background="@color/colorPrimaryDark"
android:gravity="right"/>
</LinearLayout>
</LinearLayout>
Che viene reso come segue:
Layout della griglia
GridLayout, come suggerisce il nome, è un layout utilizzato per organizzare le viste in una griglia. Un GridLayout si divide in colonne e righe. Come puoi vedere nell'esempio seguente, la quantità di colonne e / o righe è specificata dalle proprietà columnCount
e rowCount
. L'aggiunta di viste a questo layout aggiungerà la prima vista alla prima colonna, la seconda vista alla seconda colonna e la terza vista alla prima colonna della seconda riga.
<?xml version="1.0" encoding="utf-8"?>
<GridLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:columnCount="2"
android:rowCount="2">
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/first"
android:background="@color/colorPrimary"
android:layout_margin="@dimen/default_margin" />
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/second"
android:background="@color/colorPrimary"
android:layout_margin="@dimen/default_margin" />
<TextView
android:layout_width="@dimen/fixed"
android:layout_height="wrap_content"
android:text="@string/third"
android:background="@color/colorPrimary"
android:layout_margin="@dimen/default_margin" />
</GridLayout>
Layout percentuali
La libreria di supporto percentuale fornisce PercentFrameLayout
e PercentRelativeLayout
, due ViewGroup che forniscono un modo semplice per specificare dimensioni e margini di visualizzazione in termini di percentuale della dimensione complessiva.
È possibile utilizzare la libreria di supporto percentuale aggiungendo quanto segue alle proprie dipendenze.
compile 'com.android.support:percent:25.3.1'
Se si desidera visualizzare una vista che riempie lo schermo orizzontalmente ma solo metà dello schermo in verticale, si farebbe in seguito.
<android.support.percent.PercentFrameLayout
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">
<FrameLayout
app:layout_widthPercent="100%"
app:layout_heightPercent="50%"
android:background="@android:color/black" />
<android.support.percent.PercentFrameLayout>
È inoltre possibile definire le percentuali in un file XML separato con codice come:
<fraction name="margin_start_percent">25%</fraction>
E fai riferimento a loro nei tuoi layout con @fraction/margin_start_percent
.
Contengono anche la possibilità di impostare un rapporto aspetto personalizzato tramite app:layout_aspectRatio
.
Ciò ti consente di impostare solo una singola dimensione, ad esempio solo la larghezza, e l'altezza verrà determinata automaticamente in base al rapporto aspetto che hai definito, che sia 4: 3 o 16: 9 o anche un quadrato 1: 1 proporzioni.
Per esempio:
<ImageView
app:layout_widthPercent="100%"
app:layout_aspectRatio="178%"
android:scaleType="centerCrop"
android:src="@drawable/header_background"/>
FrameLayout
FrameLayout
è progettato per bloccare un'area sullo schermo per visualizzare un singolo oggetto. Tuttavia, puoi aggiungere più bambini a FrameLayout e controllare la loro posizione all'interno di FrameLayout assegnando la gravità a ciascun bambino, utilizzando l'attributo android: layout_gravity .
In genere, FrameLayout
viene utilizzato per contenere una singola vista figlio. Casi di uso comune stanno creando segnaposto per gonfiare Fragments
in Activity
, sovrapporre viste o applicare in primo piano alle viste.
Esempio:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:src="@drawable/nougat"
android:scaleType="fitCenter"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
<TextView
android:text="FrameLayout Example"
android:textSize="30sp"
android:textStyle="bold"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:gravity="center"/>
</FrameLayout>
Sembrerà così:
CoordinatorLayout
Il CoordinatorLayout
è un contenitore un po 'simile a FrameLayout
ma con capacità extra, è chiamato FrameLayout
super-potenziato nella documentazione ufficiale.
Associando un CoordinatorLayout.Behavior
a un figlio diretto di CoordinatorLayout, sarete in grado di intercettare gli eventi tattili, le finestre, le misure, il layout e lo scorrimento annidato.
Per poterlo usare, dovrai prima aggiungere una dipendenza per la libreria di supporto nel tuo file gradle:
compile 'com.android.support:design:25.3.1'
Il numero dell'ultima versione della libreria può essere trovato qui
Un caso pratico di utilizzo di CoordinatorLayout
è la creazione di una vista con un FloatingActionButton
. In questo caso specifico, creeremo un RecyclerView
con SwipeRefreshLayout
e FloatingActionButton
. Ecco come puoi farlo:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coord_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recycler_view"/>
</android.support.v4.widget.SwipeRefreshLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:clickable="true"
android:color="@color/colorAccent"
android:src="@mipmap/ic_add_white"
android:layout_gravity="end|bottom"
app:layout_anchorGravity="bottom|right|end"/>
</android.support.design.widget.CoordinatorLayout>
Nota come FloatingActionButton è ancorato al CoordinatorLayout con app:layout_anchor="@id/coord_layout"
CoordinatorLayout Comportamento di scorrimento
È possibile utilizzare un CoordinatorLayout
consente di ottenere effetti di scorrimento del disegno del materiale quando si utilizzano layout interni che supportano lo scorrimento annidato, come NestedScrollView
o RecyclerView
.
Per questo esempio:
-
app:layout_scrollFlags="scroll|enterAlways"
viene utilizzato nelle proprietà della barra degli strumenti -
app:layout_behavior="@string/appbar_scrolling_view_behavior"
viene utilizzato nelle proprietà ViewPager - Un RecyclerView viene utilizzato nei frammenti di ViewPager
Ecco il file xml di layout utilizzato in un'attività:
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="6dp">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:elevation="0dp"
app:layout_scrollFlags="scroll|enterAlways"
/>
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
app:tabMode="fixed"
android:layout_below="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
app:elevation="0dp"
app:tabTextColor="#d3d3d3"
android:minHeight="?attr/actionBarSize"
/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_below="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
</android.support.design.widget.CoordinatorLayout>
Risultato:
Visualizza peso
Uno degli attributi più utilizzati per LinearLayout è il peso delle sue viste secondarie . Peso definisce quanto spazio occuperà una vista rispetto ad altre viste all'interno di un LinearLayout.
Il peso viene utilizzato quando si desidera assegnare uno spazio dello schermo specifico a un componente rispetto all'altro.
Proprietà chiave :
weightSum
è la somma complessiva dei pesi di tutte le visualizzazioni figlio. Se non si specificaweightSum
, il sistema calcolerà da solo la somma di tutti i pesi.layout_weight
specifica la quantità di spazio fuori dalla somma di peso totale occupata dal widget.
Codice:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="4">
<EditText
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Type Your Text Here" />
<Button
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Text1" />
<Button
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Text1" />
</LinearLayout>
L'output è:
Ora, anche se la dimensione del dispositivo è maggiore, EditText richiederà 2/4 dello spazio dello schermo. Quindi l'aspetto della tua app è visto coerente su tutti gli schermi.
Nota: qui layout_width
viene mantenuto 0dp
poiché lo spazio del widget è diviso orizzontalmente. Se i widget devono essere allineati verticalmente, layout_height
sarà impostato su 0dp
. Questo viene fatto per aumentare l'efficienza del codice, perché durante il runtime il sistema non tenterà di calcolare rispettivamente la larghezza o l'altezza in quanto viene gestita dal peso. Se invece si utilizza wrap_content
il sistema wrap_content
di calcolare prima la larghezza / altezza prima di applicare l'attributo weight che causa un altro ciclo di calcolo.
Creazione di LinearLayout a livello di codice
Gerarchia
- LinearLayout(horizontal)
- ImageView
- LinearLayout(vertical)
- TextView
- TextView
Codice
LinearLayout rootView = new LinearLayout(context);
rootView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
rootView.setOrientation(LinearLayout.HORIZONTAL);
// for imageview
ImageView imageView = new ImageView(context);
// for horizontal linearlayout
LinearLayout linearLayout2 = new LinearLayout(context);
linearLayout2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
linearLayout2.setOrientation(LinearLayout.VERTICAL);
TextView tv1 = new TextView(context);
TextView tv2 = new TextView(context);
// add 2 textview to horizontal linearlayout
linearLayout2.addView(tv1);
linearLayout2.addView(tv2);
// finally, add imageview and horizontal linearlayout to vertical linearlayout (rootView)
rootView.addView(imageView);
rootView.addView(linearLayout2);
LayoutParams
Ogni singolo ViewGroup
(ad es. LinearLayout
, RelativeLayout
, CoordinatorLayout
, ecc.) LinearLayout
memorizzare le informazioni sulle proprietà dei propri figli. Riguardo al modo in cui i suoi figli sono disposti nel ViewGroup
. Queste informazioni sono memorizzate in oggetti di una classe wrapper ViewGroup.LayoutParams
.
Per includere parametri specifici per un particolare tipo di layout, i ViewGroups
utilizzano sottoclassi della classe ViewGroup.LayoutParams
.
Ad esempio per
-
LinearLayout
èLinearLayout.LayoutParams
-
RelativeLayout
èRelativeLayout.LayoutParams
-
CoordinatorLayout
èCoordinatorLayout.LayoutParams
- ...
La maggior parte dei ViewGroups
riutilizza la possibilità di impostare i margins
per i propri figli, in modo che non sottoclassi direttamente ViewGroup.LayoutParams
, ma eseguono la sottoclasse di ViewGroup.MarginLayoutParams
(che a sua volta è una sottoclasse di ViewGroup.LayoutParams
).
LayoutParams
in xml
LayoutParams
oggetti LayoutParams
vengono creati in base al file xml
layout gonfiato.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_gravity="right"
android:gravity="bottom"
android:text="Example text"
android:textColor="@android:color/holo_green_dark"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@android:color/holo_green_dark"
android:scaleType="centerInside"
android:src="@drawable/example"/>
</LinearLayout>
Tutti i parametri che iniziano con layout_
specificano come il layout racchiude dovrebbe funzionare. Quando il layout viene gonfiato, questi parametri vengono avvolti in un oggetto LayoutParams
appropriato, che in seguito verrà utilizzato dal Layout
per posizionare correttamente una particolare View
all'interno del ViewGroup
. Altri attributi di una View
sono direttamente correlati alla View
e vengono elaborati dalla View
stessa.
Per TextView
:
-
layout_width
,layout_height
elayout_gravity
verranno archiviati in un oggettoLinearLayout.LayoutParams
e utilizzati daLinearLayout
-
gravity
,text
etextColor
saranno utilizzati daTextView
stesso
Per ImageView
:
-
layout_width
,layout_height
elayout_weight
verranno archiviati in un oggettoLinearLayout.LayoutParams
e utilizzati daLinearLayout
-
background
,scaleType
esrc
saranno utilizzati daImageView
stesso
Ottenere oggetto LayoutParams
getLayoutParams
è una View's
metodo che permette di recuperare una corrente LayoutParams
oggetto.
Poiché l'oggetto LayoutParams
è direttamente correlato al ViewGroup
che lo racchiude , questo metodo restituirà un valore non null solo quando View
è collegato al ViewGroup
. È necessario tenere a mente che questo oggetto potrebbe non essere presente in ogni momento. Soprattutto non dovresti dipendere dal fatto di averlo nel costruttore View's
.
public class ExampleView extends View {
public ExampleView(Context context) {
super(context);
setupView(context);
}
public ExampleView(Context context, AttributeSet attrs) {
super(context, attrs);
setupView(context);
}
public ExampleView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setupView(context);
}
private void setupView(Context context) {
if (getLayoutParams().height == 50){ // DO NOT DO THIS!
// This might produce NullPointerException
doSomething();
}
}
//...
}
Se vuoi dipendere dall'avere oggetto LayoutParams
, dovresti usare invece il metodo onAttachedToWindow
.
public class ExampleView extends View {
public ExampleView(Context context) {
super(context);
}
public ExampleView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ExampleView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (getLayoutParams().height == 50) { // getLayoutParams() will NOT return null here
doSomething();
}
}
//...
}
Oggetto Casting LayoutParams
Potrebbe essere necessario utilizzare funzionalità specifiche per un particolare ViewGroup
(ad esempio, potrebbe essere necessario modificare a livello di ViewGroup
regole di un RelativeLayout
). A tale scopo è necessario sapere come eseguire correttamente il cast dell'oggetto ViewGroup.LayoutParams
.
Questo potrebbe essere un po 'di confusione quando si ottiene un oggetto LayoutParams
per un figlio View
che in realtà è un altro ViewGroup
.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/outer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/inner_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="right"/>
</LinearLayout>
IMPORTANTE: il tipo di oggetto LayoutParams
è direttamente correlato al tipo del ViewGroup ViewGroup
.
Casting errato :
FrameLayout innerLayout = (FrameLayout)findViewById(R.id.inner_layout);
FrameLayout.LayoutParams par = (FrameLayout.LayoutParams) innerLayout.getLayoutParams();
// INCORRECT! This will produce ClassCastException
Cast corretta :
FrameLayout innerLayout = (FrameLayout)findViewById(R.id.inner_layout);
LinearLayout.LayoutParams par = (LinearLayout.LayoutParams) innerLayout.getLayoutParams();
// CORRECT! the enclosing layout is a LinearLayout