2017-02-05 8 views
14

В соответствии с material design spec, когда клавиатура появляется, BottomNavigationView должен скрываться под ней. Однако, если я установил android:windowSoftInputMode="adjustResize" в манифест активности, то BottomNavigationView перемещается над клавиатурой.Как скрыть нижний план навигации под клавиатурой с помощью настройкиРазличный набор

Мне нужно установить adjustResize, чтобы включить прокрутку в нижней части экрана, пока клавиатура открыта. Тем не менее, я не хочу, чтобы BottomNavigationView был видимым. Это можно сделать?

Как она в настоящее время выглядит:

enter image description here

Схема XML (на самом деле было бы FrameLayout где EditText является и EditText бы внутри него):

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    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"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="Input" 
     android:layout_gravity="center" 
     android:layout_centerVertical="true"/> 

    <android.support.design.widget.BottomNavigationView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     app:itemBackground="@color/colorPrimary" 
     app:menu="@menu/menu_bottom_navigation" 
     app:itemIconTint="@android:color/white" 
     app:itemTextColor="@android:color/white"/> 

</RelativeLayout> 
+0

Вы решили это? –

+0

Нет, я не делал этого, но одно предложение заключалось в том, чтобы скрыть все, что находится за клавиатурой, когда поле используется (включая нижнюю панель навигации), тогда, когда пользователь нажимает экран над клавиатурой или прокручивает клавиатуру, просто исчезает. Это не здорово, но я думаю, что это лучший пользовательский интерфейс, чем плавающий nav bar. Приложение Spotify делает это. – willjgriff

+0

У меня такая же проблема ... Если вы найдете решение, скажите, пожалуйста ... –

ответ

-1

Как a альтернатива способ с вашим android:windowSoftInputMode="adjustResize" вы можете попробовать.

вызов этого метода из вашего OnCreate - после того, как клавиатура поднята, вы можете изменить видимость просмотров, которые вам не нужно показывать! Когда клавиатура выключена, снова отобразите их.

public void checkKeyBoardUp(){ 
     rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       Rect r = new Rect(); 
       rootView.getWindowVisibleDisplayFrame(r); 
       int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top); 

       if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... 
        //ok now we know the keyboard is up... 
        whatEverView.setVisibility(View.INVISIBLE); 

       }else{ 
        //ok now we know the keyboard is down... 
        whatEverView.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 
    } 
+0

Правильное решение, но для правильной проверки статуса клавиатуры, используйте эту ссылку [http://www.stackoverflow.com/a/ 4737265/920379) –

+2

Это не работает: пробел остается на месте navbar –

16

Добавьте это к Вашей деятельности в проявленном

android:windowSoftInputMode="adjustPan" 

Так как

<activity android:name=".feature.home.HomeActivity" 
android:windowSoftInputMode="adjustPan"/> 
0

Существует еще одно решение, которое не требует adjustSpan, но он работает только для API >= 21. Вы можете определить, отображается или скрыта клавиатура, отслеживая системные вставки. Скажем, у вас есть BottomNavigationView, который является потомком LinearLayout и вам нужно, чтобы скрыть его, когда клавиатура отображается:

> LinearLayout 
    > ContentView 
    > BottomNavigationView 

Все, что вам нужно сделать, это расширить LinearLayout таким образом:

public class KeyboardAwareLinearLayout extends LinearLayout { 
    public KeyboardAwareLinearLayout(Context context) { 
     super(context); 
    } 

    public KeyboardAwareLinearLayout(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public KeyboardAwareLinearLayout(Context context, 
            @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public KeyboardAwareLinearLayout(Context context, AttributeSet attrs, 
            int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    public WindowInsets onApplyWindowInsets(WindowInsets insets) { 
     int childCount = getChildCount(); 
     for (int index = 0; index < childCount; index++) { 
      View view = getChildAt(index); 
      if (view instanceof BottomNavigationView) { 
       int bottom = insets.getSystemWindowInsetBottom(); 
       if (bottom >= ViewUtils.dpToPx(200)) { 
        view.setVisibility(GONE); 
       } else { 
        view.setVisibility(VISIBLE); 
       } 
      } 
     } 
     return insets; 
    } 
} 

Идея заключается в том, что при отображении клавиатуры системные вставки изменяются с довольно большим значением .bottom.