2016-03-31 6 views
17

У меня возникли проблемы с новой нижней панелью. Я не могу заставить переместить закусочную над нижней планкой (это то, как мне сказали руководство по проектированию, должно быть https://www.google.com/design/spec/components/bottom-navigation.html#bottom-navigation-specs).Перемещение закусочной над нижней панелью

Это мой 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> 

Это мой 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> 

закусочная в main_activity.java выглядит следующим образом

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

Поделитесь своим полным файлом макета. Ваш файл макета не завершен. –

+0

Отредактировал мой вопрос. Мысль, это не нужно. – Wladislaw

+1

Вы хотите разместить закусочную над ним? – Nidhi

ответ

16

заменить 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> 

и код Snackbar будет

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

Да, спасибо большое. Это сработало! – Wladislaw

+0

Я столкнулся с проблемой, что мой макет моего фрагмента скрыт, когда я использую этот метод у вас. Мой макет только где-то, где я не вижу его. Есть идеи? Возможно, это новый вопрос, но он имеет какое-то отношение к вашему ответу. – Wladislaw

+0

Вы имеете в виду Viewpager? –

13

Вы можете сделать это программно без загромождения XML с дополнительными CoordinatorLayouts за счет изменения рентабельности закусочной в.

Java Пример:

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(); 

Котлин одиночная линия:

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

У меня есть аналогичный подход, просто используйте bottomMargin параметров макета snackbar http://stackoverflow.com/a/40686399/3304280 – Cheng

+1

в моем случае это работает, но закуска скользит по нижней панели, а не позади нее. –

+0

@ CarlosHernándezGil Он скользит, потому что ваш снимок внизу имеет более низкую высоту/Z-свойство. Закусочная имеет высоту 6 дп. Увеличьте высоту вашего представления, установив свойство высот выше 6dp в XML или stateListAnimator. См. [Документация по Android] (https://developer.android.com/guide/topics/graphics/prop-animation.html#property-vs-view) для работы с анимацией значений свойств и посетите [Руководство по дизайну материалов] (https: //material.io/guidelines/material-design/elevation-shadows.html#elevation-shadows-elevation-android) для возвышений. –

1

Я использую BottomNavigationView и закусочной от поддержки проектирования библиотеки версии 25.3.1 на целевой ОС KitKat, леденец и Зефир. На леденец и выше Snackbar прячется за BottomNavigationView, но в Kitkat BottomNavigationView скрывается за Snackbar.

Я попытался показать закусочную с другим подходом. Когда Snackbar отображается, BottomNavigationView переводится по оси Y (прокручивается вниз), используя свойство перевода и Интерполтор. Как только Snackbar ушел, BottomNavigationView снова появляется с тем же свойством translationY.

Скрытие BottomNavigationView (в направлении вниз):

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

Отображение BottomNavigationView назад на экране:

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

Если предположить, что работают с CoordinatorLayout вы можете изменить layoutparams в закусочной перед вызов show(). Установив anchorId и anchorGravity, snackBar отобразится над нижней навигационной панелью:

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

Спасибо, брат –

Смежные вопросы