2016-03-31 25 views
17

sto affrontando alcuni problemi con la nuova barra inferiore. Non riesco a forzare lo spostamento dello snackbar sopra la barra inferiore (questo è il modo in cui le linee guida del design dovrebbero essere https://www.google.com/design/spec/components/bottom-navigation.html#bottom-navigation-specs).Sposta snack bar sopra la barra in basso

Questo è il mio activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 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/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:openDrawer="start"> 

<include 
    layout="@layout/app_bar_main_activity" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main_activity" 
    app:menu="@menu/activity_main_drawer" /> 

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

Questo è il mio app_bar_main_activity.xml

<?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:id="@+id/main_content" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context="test.tab_activity"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="@dimen/appbar_padding_top" 
    android:theme="@style/MyAppTheme.NoActionBar.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/main_activity_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways" 
     app:popupTheme="@style/MyAppTheme.NoActionBar.PopupOverlay"> 

    </android.support.v7.widget.Toolbar> 

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



<android.support.v4.view.ViewPager 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

<LinearLayout 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" 
    android:orientation="vertical"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/view_pager" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="end|bottom" 
     android:layout_margin="@dimen/fab_margin" 
     android:src="@drawable/ic_add_white_24dp" /> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tab_layout" 
     style="@style/AppTabLayout" 
     android:layout_width="match_parent" 
     android:layout_height="56dp" 
     android:background="?attr/colorPrimary" 
     /> 

</LinearLayout> 

Lo snack in main_activity.java assomiglia a questo

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(findViewById(R.id.main_content), "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 

Wrong...snackbar should be above bottom bar

+0

Condividi il file di layout completo. Il tuo file di layout non è completo. –

+0

Modificata la mia domanda. Pensiero, non è necessario. – Wladislaw

+1

Vuoi posizionare lo snackbar sopra il bottombar? – Nidhi

risposta

16

sostituire il vostro xml ->

<?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:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="test.tab_activity"> 

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

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

     </android.support.v7.widget.Toolbar> 

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



    <android.support.v4.view.ViewPager 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <android.support.design.widget.CoordinatorLayout 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:id="@+id/placeSnackBar"> 

      <android.support.v4.view.ViewPager 
       android:id="@+id/view_pager" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_weight="1" /> 

      <android.support.design.widget.FloatingActionButton 
       android:id="@+id/fab" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="end|bottom" 
       android:layout_margin="@dimen/fab_margin" 
       android:src="@drawable/ic_menu_gallery" /> 

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

     <android.support.design.widget.TabLayout 
      android:id="@+id/tab_layout" 
      android:layout_width="match_parent" 
      android:layout_height="56dp" 
      android:background="?attr/colorPrimary" /> 

    </LinearLayout> 

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

e Il codice Snackbar sarà

Snackbar.make(findViewById(R.id.placeSnackBar), "Replace with your own action", Snackbar.LENGTH_LONG) 
      .setAction("Action", null).show(); 
+0

Sì, grazie mille. Ha funzionato! – Wladislaw

+0

sto affrontando il problema, che il mio layout del mio frammento è nascosto, quando uso il metodo da te. Il mio layout è solo da qualche parte, dove non riesco a vederlo. Qualche idea? È forse una nuova domanda, ma ha qualcosa a che fare con la tua risposta. – Wladislaw

+0

Intendi il Viewpager? –

13

È possibile farlo a livello di codice senza ingombrare il tuo XML con CoordinatorLayouts aggiuntivi modificando i margini del Snackbar.

Java esempio:

Snackbar snack = Snackbar.make(findViewById(R.id.coordinatorLayout), 
    "Your message", Snackbar.LENGTH_LONG); 
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) 
    snack.getView().getLayoutParams(); 
params.setMargins(leftMargin, topMargin, rightMargin, bottomBar.height); 
snack.getView().setLayoutParams(params); 
snack.show(); 

Kotlin linea singola:

Snackbar.make(coordinatorLayout, "Your message", Snackbar.LENGTH_LONG).apply {view.layoutParams = (view.layoutParams as CoordinatorLayout.LayoutParams).apply {setMargins(leftMargin, topMargin, rightMargin, bottomBar.height)}}.show() 
+0

Ho un approccio simile, basta usare bottomMargin dei parametri di layout snackbar http://stackoverflow.com/a/40686399/3304280 – Cheng

+1

nel mio caso funziona, ma lo snack scorre sulla barra in basso, non dietro di esso. –

+0

@ CarlosHernándezGil Scivola perché la vista in basso ha una elevazione/proprietà Z più bassa. Gli snack bar hanno un'altezza di 6 pence. Aumentare l'elevazione della vista impostando la proprietà di elevazione superiore a 6dp in XML o a stateListAnimator. Vedi [Documentazione Android] (https://developer.android.com/guide/topics/graphics/prop-animation.html#property-vs-view) per lavorare con l'animazione dei valori delle proprietà e visitare [Linee guida sulla progettazione dei materiali] (https: //material.io/guidelines/material-design/elevation-shadows.html#elevation-shadows-elevation-android) per le elevazioni. –

1

Sto usando il BottomNavigationView e Snackbar dalla libreria di supporto di progettazione versione 25.3.1 su OS bersaglio KitKat, lecca-lecca e Marshmallow. Sul lecca-lecca e sopra Snackbar si nasconde dietro BottomNavigationView ma in Kitkat BottomNavigationView è nascosto dietro Snackbar.

Ho provato a mostrare lo Snackbar con un approccio diverso. Quando viene visualizzato lo Snackbar, BottomNavigationView viene tradotto sull'asse Y (scorrendo verso il basso) utilizzando la proprietà translationY e l'interpolatore. Una volta che Snackbar è scomparso, BottomNavigationView viene nuovamente visualizzato con la stessa proprietà translationY.

nascondere il BottomNavigationView (verso il basso):

CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) bottomNavigationView.getLayoutParams(); 
bottomNavigationView.animate().translationY(bottomNavigationView.getHeight() + layoutParams.bottomMargin).setInterpolator(new LinearInterpolator()).start(); 

Mostrando il BottomNavigationView torna sullo schermo:

bottomNavigationView.animate().translationY(0).setInterpolator(new LinearInterpolator()).start(); 
1

Supponendo che si sta lavorando con CoordinatorLayout è possibile modificare layoutparams del Snackbar prima chiamata show(). Impostando anchorID e anchorGravity lo snackBar verrà visualizzato sopra la barra di navigazione in basso:

val layoutParams = snackbar.view.layoutParams as CoordinatorLayout.LayoutParams 
layoutParams.anchorId = R.id.navigation //Id for your bottomNavBar or TabLayout 
layoutParams.anchorGravity = Gravity.TOP 
layoutParams.gravity = Gravity.TOP 
snackbar.view.layoutParams = layoutParams 
+0

Grazie fratello –