2015-09-18 15 views
9

Ho un problema con il mio FrameLayout (contenitore nel layout del cassetto). L'altezza di FrameLayout supera l'altezza dello schermo (sotto i pulsanti del menu predefinito di Android in basso).Android - Altezza del layout del fotogramma non corrispondente al layout del coordinatore

<android.support.design.widget.CoordinatorLayout 
     android:id="@+id/main_content" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

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

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:minHeight="?attr/actionBarSize" 
       app:layout_scrollFlags="scroll|enterAlways" /> 

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

     <FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

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

Height exceeding as seen in Android Studio Designer

+1

io sono sempre lo stesso problema, è questo Coordinatore bug Android o è la loro alcuna soluzione per questo. (Senza dare il margine inferiore come dimen di altezza barra di azione) – DeepakPanwar

risposta

4

Il mio primo tentativo è stato quello di impostare un android:layout_marginBottom="?attr/actionBarSize" al FrameLayout. Questo ha risolto la soluzione per le viste non scorrevoli con altezza "fissa" in termini di contenuto non scorrevole verticalmente (come un consueto RelativeLayout con altezza match_parent). L'allineamento di un componente al fondatore genitore (android:layout_alignParentBottom="true") produce un elemento ancora visibile. Nell'anteprima di Android Studio non è visibile il superamento dell'altezza.

Tuttavia, questo margineBotton-fix introduce un nuovo problema per i frammenti la cui vista radice è scorrevole (come un RecyclerView). Per queste viste quando si scorre verso il basso il margine inferiore diventerà visibile in una barra bianca (nel caso in cui il bianco sia il colore di sfondo). Questo cuciture ragionevole, come per quelle viste la funzionalità di scorrimento annidato farà scorrere il barra ListView with last item cut

tl; dr ho lavorato intorno a quel problema applicando il la ?attr/actionBarSize margine come inferiore a frammenti non scorrevoli che sono presenti all'interno il Framelayout. In precedenza ho impostato l'altezza della barra degli strumenti su ?attr/actionBarSize.

layout di attività:

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

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

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

     <FrameLayout 
       android:id="@+id/container" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     /> 

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

disposizione Frammento:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_marginBottom="?attr/actionBarSize" 
      android:orientation="vertical"> 
      <!-- Further stuff here --> 
      <TextView android:id="@+id/label" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentBottom="true" 
      /> 
    </LinearLayout> 

L'unico aspetto negativo che ho dovuto affrontare in questo momento è lo spazio bianco per essere mostrato in Previewer di Android Studio durante la creazione del layout di frammento.

+0

Questo ha funzionato bene per me! Come nota a margine, se uno dei tuoi frammenti ha una radice scorrevole che nasconde la barra dell'app, rimarrà nascosto quando si ritorna a un precedente (non scorrevole) frammento senza modo di mostrarlo di nuovo. È disponibile una soluzione alternativa per questo problema [disponibile qui] (http://stackoverflow.com/q/30554824/1794631). – rmorrin

1

Se si utilizza diverso Fragments all'interno del proprio CoordinatorLayout si dovrà affrontare il problema, che alcuni Fragments hanno contenuti scorrevoli e alcuni non devono scorrere. Il tuo Toolbar ha i flag a scorrimento "scroll|enterAlways", che è ok per i layout precedenti, ma non ok per quest'ultimo. La mia soluzione è una custom AppBarLayout.Behavior che cambia i flag di scorrimento a seconda del tag personalizzato (contentShouldNotScrollTag). Impostare questo tag per i layout, che non dovrebbero scorrere in questo modo:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:tag="@string/contentShouldNotScrollTag"> 
    <!-- my non-scrollable Fragment layout --> 
</FrameLayout> 

Come risultato, l'altezza di questo frammento non supererà l'altezza dello schermo. Qui è la classe comportamento personalizzato per il AppBarLayout:

public class MyScrollBehavior extends AppBarLayout.Behavior { 
    private View content; 

    public MyScrollBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean onMeasureChild(CoordinatorLayout parent, AppBarLayout appBarLayout, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { 
     if(content == null) { 
      content = parent.findViewById(R.id.container); 
     } 

     if(content != null) { 
      boolean shouldNotScroll = content.findViewWithTag(parent.getContext().getString(R.string.contentShouldNotScrollTag)) != null; 
      Toolbar toolbar = (Toolbar) appBarLayout.findViewById(R.id.toolbar); 
      AppBarLayout.LayoutParams params = 
        (AppBarLayout.LayoutParams) toolbar.getLayoutParams(); 
      if (shouldNotScroll) { 
       params.setScrollFlags(0); 
       appBarLayout.setExpanded(true, true); 
      } else { 
       params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL 
         | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS); 
      } 
     } 

     return super.onMeasureChild(parent, appBarLayout, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed); 
    } 
} 
Problemi correlati