出现软键盘时如何避免只有BottomNavbar向上推

Posted

技术标签:

【中文标题】出现软键盘时如何避免只有BottomNavbar向上推【英文标题】:How to avoid only BottomNavbar to pushed up when soft keyboard appears 【发布时间】:2021-02-04 08:30:51 【问题描述】:

我的安卓应用中有这样的视图

有一个mainActivity,它有那个bottomNavBar,并且在activity里面有一个片段,底部有两个按钮。

我应该做的是,当软键盘出现时bottomNavBar 应该留在底部(键盘后面)但是这两个按钮应该向上推并在键盘顶部可见

如果我在manifest 文件中为mainActivity 设置android:windowSoftInputMode="adjustResize",那么键盘也会向上推bottomNavBar 和按钮。

如果我将android:windowSoftInputMode="adjustResize" 仅设置为片段(以编程方式),那么它仍然会显示相同的行为。

我该怎么做?任何建议将不胜感激

这是我的活动 xml

    <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <LinearLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:id="@+id/container"
        android:layout_
        android:layout_>
        <fragment
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_
            android:layout_
            app:defaultNavHost="true"
            app:navGraph="@navigation/mobile_navigation"
            android:layout_weight="@integer/int_two"/>

        <com.google.android.material.bottomnavigation.BottomNavigationView
            app:itemIconTint="@drawable/bottom_navigation_selector"
            app:itemTextColor="@drawable/bottom_navigation_selector"
            android:id="@+id/nav_view"
            android:layout_
            android:layout_
            android:layout_weight="@integer/int_zero"
            android:background="?android:attr/windowBackground"
            app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
            app:menu="@menu/bottom_nav_menu" />

    </LinearLayout>
</layout>

【问题讨论】:

你试过 android:windowSoftInputMode="adjustPan|stateHidden" 吗? 【参考方案1】:

我也面临同样的问题,经过多次努力,我找到了一个适合我的解决方案。我做什么,当 keyboard appers 使 bottomNavBar 可见性 GONE反之亦然

试试这个获取键盘openclose事件 -

view.getViewTreeObserver().addOnGlobalLayoutListener(() -> 
      Rect r = new Rect();
      view.getWindowVisibleDisplayFrame(r);
      if (view.getRootView().getHeight() - (r.bottom - r.top) > 500) 
        // on Keyboard Open
        llBottomNavBarLayout.setVisibility(View.GONE);
       else 
        // on keyboard close
        llBottomNavBarLayout.setVisibility(View.VISIBLE);
      
    );

为了获得视图我使用

LayoutInflater layoutInflater = getLayoutInflater();
View view = layoutInflater.inflate(R.layout.activity_abc, null);

【讨论】:

它成功了,谢谢,但你能告诉我为什么我们使用价值 500 吗?【参考方案2】:

感谢您的更新。我试过你的布局。在适当的活动上添加到您的清单android:windowSoftInputMode="adjustNothing" 请注意,这也会影响 FAB 和其他锚视图

<activity
   android:name=".activities.MainActivity"
   android:windowSoftInputMode="adjustNothing">
     <intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

【讨论】:

我试过了,但没用。我已经为你更新了问题。可以看到活动代码

以上是关于出现软键盘时如何避免只有BottomNavbar向上推的主要内容,如果未能解决你的问题,请参考以下文章

部分安卓手机上出现切换界面时软键盘无法收回的情况,请问该如何解决?

如何避免元素重叠在RelativeLayout上显示软键盘

软键盘出现时如何保持Android webview中的固定页脚不覆盖输入字段?

在软键盘打开/关闭之前,RecyclerView 不会更新并显示在屏幕上

Android - 如何在软键盘出现时调整弹出窗口

为啥在软键盘出现和消失时抖动 UI 滞后?