23

Ho un layout di coordinatore con un recyclerview che desidero aggiungere a livello di codice. Il motivo per cui viene aggiunto in modo programmatico è perché diversi frammenti che gonfiano il layout del coordinatore possono utilizzare diversi tipi di viste sul riciclaggio.Impostazione dell'app: layout_behavior a livello di codice

Tipicamente per un recyclerview, al fine di impostare questo comportamento vorrei aggiungerlo nella xml:

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

che funziona bene. Tuttavia, sono ad una perdita completa su come aggiungere questo comportamento quando creo le recyclerviews di programmazione e quindi aggiungerli alla framelayout:

<?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" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:id="@+id/coordLayout" 
    android:layout_height="match_parent" android:fitsSystemWindows="true" 
    tools:context=".MainActivity"> 

    <android.support.design.widget.AppBarLayout android:id="@+id/app_bar" 
     android:fitsSystemWindows="true" android:layout_height="@dimen/app_bar_height" 
     android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/toolbar_layout" 
      android:fitsSystemWindows="true" android:layout_width="match_parent" 
      android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed" 
      app:contentScrim="?attr/colorPrimary"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_height="?attr/actionBarSize" 
       android:layout_width="match_parent" 
       app:layout_collapseMode="pin" 
       app:popupTheme="@style/AppTheme.PopupOverlay" /> 

     </android.support.design.widget.CollapsingToolbarLayout> 

    </android.support.design.widget.AppBarLayout> 
    <FrameLayout 
     android:id="@+id/frameLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

    </FrameLayout> 

</android.support.design.widget.CoordinatorLayout> 

risposta

59

Behavior è un parametro del CoordinatorLayout.LayoutParams. È possibile impostare il comportamento su un'istanza di CoordinatorLayout.LayoutParams con il metodo setBehavior.

Per ottenere un oggetto Behavior corretto che rappresenta la stessa cosa di @string/appbar_scrolling_view_behavior, è necessario creare un'istanza di AppBarLayout.ScrollingViewBehavior.


Edit 1:

non hanno davvero un esempio, ma posso forse scriverne uno. Supponendo di avere un (ad esempio yourView) che è già collegato a uno CoordinatorLayout (quindi ha già LayoutParams).

CoordinatorLayout.LayoutParams params = 
          (CoordinatorLayout.LayoutParams) yourView.getLayoutParams(); 
params.setBehavior(new AppBarLayout.ScrollingViewBehavior()); 
yourView.requestLayout(); 

Potrebbe essere necessario modificarlo leggermente (non l'ho provato, ma dovrebbe funzionare).


Edit 2:

Solo una piccola dichiarazione di non responsabilità perché non tutti sembrano capire l'esempio perfetto.

yourView menzionato nell'esempio sopra riportato è NON lo CoordinatorLayout stesso. yourView è CoordinatorLayout's bambino View.

+1

Avete un esempio in cui questo viene fatto a livello di programmazione? – AndroidP

+0

Sentiti libero di controllare la mia modifica –

+0

Grazie mille. – AndroidP

1

La risposta accettata è corretta ma il codice fornito non è compilabile. Quindi, ecco un esempio completo

CoordinatorLayout.LayoutParams params = 
         (CoordinatorLayout.LayoutParams) view.getLayoutParams(); 

params.setBehavior (nuova AppBarLayout.ScrollingViewBehavior (view.getContext(), null));

2 ° parametro è AttributeSet ed è corretto averlo come null anche se non è contrassegnato come Nullable nella lib di supporto.

Problemi correlati