oreo - Barra de navegación de Android que cubre el contenido de viewpager
cambiar barra de navegacion android p (6)
¡No puedo evitar que la barra de navegación de sistemas cubra mi contenido!
Estoy en la parte inferior de la vista de reciclaje, pero se está ocultando detrás de la barra de navegación. Aquí está mi diseño XML.
<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/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<include layout="@layout/toolbar"/>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:fitsSystemWindows="true"
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.melnykov.fab.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"
app:fab_colorNormal="@color/accent"
app:fab_colorPressed="@color/accent_dark" />
Aquí está el diseño de fragmentos que están viendo en la imagen.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
</FrameLayout>
He intentado agregar android: fitsSystemWindows = "true" en todos los diseños que pude pero eso no funcionó. Otros subprocesos mencionan la adición de margen calculado desde la barra, pero esa no parece la solución adecuada. Tomé este diseño directamente de la aplicación CheesSquare de Google que muestra la aplicación appbarlayout, y parece que funciona bien.
El problema es el uso de AppBarLayout
. El CoordinatorLayout
se introdujo como un potente FrameLayout
que ofrece animaciones agradables basadas en Behaviors
definidos. Si queremos agregar algún tipo de animación de scroll
, como collapsing toolbar
, etc., entonces tenemos que envolver nuestra Toolbar
con AppBarLayout
, pero cuando queremos colocar un contenido estático dentro de CoordinatorLayout
, como ViewPager
en su caso, no lo hacemos. t necesita usar AppBarLayout
en absoluto:
activity_main.xml:
<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:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.mydemoci.MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
<include layout="@layout/content_main"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email"/>
</android.support.design.widget.CoordinatorLayout>
content_main.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#A1D490"
// Remember CoordinatorLayout is a kind of FrameLayout,
// so we have to provide top margin to make Toolbar visible
android:layout_marginTop="?attr/actionBarSize"
tools:context="com.mydemoci.MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@color/colorAccent"
android:text="Hello World"
android:textSize="30sp"/>
</RelativeLayout>
La vista de la raíz del fragmento de Viewpager tiene que ser RecyclerView
o NestedScrollView
. FrameLayout
no admite el comportamiento de desplazamiento de CoordinatorLayout
y es por eso que no funciona bien.
Cómo puede arreglar el diseño del fragmento del viewpager: no FrameLayout
RecyclerView
dentro de FrameLayout
. En su lugar declara RecyclerView
en la raíz. También puedes configurar padding="8dp"
en RecyclerView
, solo usa android:clipToPadding="false"
.
Me lo imaginé. En mi situación particular, cada uno de mis fragmentos gestiona su propia instancia de la barra de herramientas. Estaba llamando a setSupportActionBar () en el método onViewCreated () en mis fragmentos. Mover esta funcionalidad en onCreateView () lo resolvió.
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_my_account, container, false);
setupToolbar((Toolbar) view.findViewById(R.id.toolbar));
return view;
}
private void setupToolbar(Toolbar toolbar) {
toolbarController.registerToolbar(toolbar);
toolbarController.setActivityTitle("My Account");
}
(registerToolbar () llama a setSupportActionBar () dentro de la actividad de alojamiento).
Espero que esto ayude a todos!
Simplemente agregando margen inferior a View Pager
arréglalo.
Aquí está el código en mi activity_main.xml
<android.support.v4.view.ViewPager
android:id="@+id/main_viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="55dp"/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/navigation" />
Vaya a style.xml y elimine estos dos elementos, o establezca sus valores "verdaderos" en "falso".
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
En mi caso, el problema se resolvió eliminando estos dos valores de estilos de tema.
intenta reemplazar tu dependencia de gradle
com.android.support:recyclerview-v7:22.0.+
con
com.android.support:recyclerview-v7:22.2.0
o
com.android.support:recyclerview-v7:+
(No estoy seguro de que esta sea la notación correcta)