2015-06-21 1 views
10

Ho il seguente layout: un cassetto, con la vista del contenuto principale con AppBarLayout, RecyclerView e TextView. Quando faccio scorrere il riciclatore, la barra degli strumenti è nascosta correttamente.Mostra programmaticamente la barra degli strumenti dopo essere stato nascosto scorrendo (Libreria di design Android)

Tuttavia, ho un caso d'uso: quando tutti gli elementi dal riciclatore vengono rimossi, imposto la sua visibilità a 'gone' e un TextView con un messaggio appropriato che viene mostrato al suo posto. Se questo viene eseguito mentre la barra degli strumenti è nascosta, non è possibile per l'utente visualizzare nuovamente la barra degli strumenti.

E 'possibile visualizzare a livello di programmazione la barra degli strumenti? Lo farei ogni volta che viene visualizzato TextView al posto di RecyclerView.

Ecco il mio layout:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    android:id="@+id/drawer_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" 
    android:animateLayoutChanges="true"> 

    <android.support.design.widget.CoordinatorLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?android:attr/actionBarSize" 
       app:layout_scrollFlags="scroll|enterAlways"/> 

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

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/test_list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scrollbars="vertical" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

     <TextView 
      android:id="@+id/empty_test_list_info_label" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center" 
      android:padding="@dimen/spacing_big" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:visibility="gone"/> 

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

    <RelativeLayout 
     android:layout_width="280dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="?android:attr/windowBackground" 
     android:elevation="10dp"/> 

</android.support.v4.widget.DrawerLayout> 

BTW, per qualche ragione, se metto l'AppBarLayour dopo la RecyclerView, come tutti i tutorial sembrano mostrare, nasconde l'elemento più in alto nella lista. Funziona correttamente solo quando è sopra di esso.

+0

hai trovato una soluzione per questo? Ho lo stesso problema .. –

+0

@GennadiiSaprykin - no, non l'ho fatto, mi dispiace. Penso che alla fine ho implementato qualcosa di diverso, ma è passato molto tempo e non so cosa fosse, e da allora ho cambiato i progetti. – wujek

risposta

0

U potrebbe fare toolbar.transitionY (int y); sul metodo di scorrimento in avanti o utilizza visibilità sparita e devi aggiungere un'intestazione nella visualizzazione elenco o nella visualizzazione recycler con le dimensioni della barra degli strumenti. In modo che l'intera lista mostri ancora

+0

Non esiste alcun metodo transitionY su Toolbar. Intendevi 'setTranslationY'? Ad ogni modo, non funziona. – wujek

+0

Qui uso la listview non recyclerview ma puoi farne un esempio. Quindi quello che ho fatto è stato creare un listview personalizzato che ottenga DeltaY dello scrolling. (Credo che RecyclerView.OnScrollListener lo fornisce già non ne sono sicuro) quindi traduco la barra degli strumenti. [collegamento] (https://github.com/Jjastiny/ToolbarTranslatingListView) –

0

È necessario inserire l'intestazione su RecyclerView all'altezza dello AppBarLayout. Nella posizione 0 di RecyclerView, è necessario aggiungere l'intestazione e quindi il resto degli elementi.

Se si desidera mostrare con forza il Toolbar, in realtà il AppBarLayout con compensazione superiore e inferiore dei AppBarLayout viste dipendenti (si chiama Behavoir). È necessario mantenere il riferimento dell'altezza dello AppBarLayout, poiché sappiamo che l'altezza è la distanza tra top and bottom della vista Rect.

Supponendo che il vostro AppBarLayout tenere solo Toolbar:

int mAppBarLayoutHeight = mAppBarLayout.getBottom() - mAppBarLayout.getTop(); //initial, normal height 

private void showToolbar(){ 
     if(this.mAnimator == null) { 
      this.mAnimator = new ValueAnimator(); 
      this.mAnimator.setInterpolator(new DecelerateInterpolator()); 
      this.mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator animation) { 
       int animatedOffset = (int) animation.getAnimatedValue(); 
       mToolbar.offsetTopBottom(animatedOffset/2); 
       } 
      }); 
     } else { 
      this.mAnimator.cancel(); 
     } 

     this.mAnimator.setIntValues(0, mAppBarLayoutHeight); 
     this.mAnimator.start(); 
    } 
+0

Questo non funziona. Non viene compilato neanche - per questo, 'mToolbar.offsetTopAndBottom' deve essere usato. Tuttavia, non succede nulla. – wujek

7

Puoi farlo accedendo al AppBarLayout che contiene il Toolbar

Ecco un esempio:

if (mToolbar.getParent() instanceof AppBarLayout){ 
    ((AppBarLayout)mToolbar.getParent()).setExpanded(true,true); 
} 

setExpanded (espandere, animazione) farà il lavoro. Puoi anche avere un riferimento all'AppBarLayout invece di chiamare getParent dalla barra degli strumenti.

+0

Funziona anche con un TabLayout invece che con una barra degli strumenti! – Annihil