如何避免软键盘推高我的布局?

Jay*_*Jay 120 android android-layout

我在每个活动的底部都有一组导航按钮.在某些活动中,我需要在其顶部搜索文本视图.但是,每当用户在textview中键入内容时,软键盘总是会向上推导我的导航按钮,即使它实际上没有阻止文本视图.它让我的UI看起来很有趣.如何强制我的导航按钮在不受软键盘推动的情况下保持静止?我试图设置Activity的windowSoftInputMode,但没有一个配置有帮助.

有什么建议?谢谢

dro*_*kid 156

我确实有同样的问题,起初我补充道:

<activity
    android:name="com.companyname.applicationname"
    android:windowSoftInputMode="adjustPan">
Run Code Online (Sandbox Code Playgroud)

到我的清单文件.但仅凭这一点并没有解决问题.然后正如Artem Russakovskii所说,我补充道:

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:isScrollContainer="false">
</ScrollView>
Run Code Online (Sandbox Code Playgroud)

在scrollview中.

这对我有用.

  • 将代码添加到清单文件对我有用.我的特殊问题不是使用ScrollView,而是使用LinearLayout.我把它添加到我的清单:`(android:windowSoftInputMode ="adjustPan")` (4认同)
  • 不滚动的滚动视图不是一个正确的选择 (2认同)

Art*_*kii 71

在我的情况下,按钮被推高的原因是因为它们上方的视图是一个ScrollView,并且无论android:windowSoftInputMode我设置的是什么值,按钮都被推到键盘上方.

我能够通过设置避免我的底部按钮被软键盘向上推

android:isScrollContainer="false" 
Run Code Online (Sandbox Code Playgroud)

ScrollView那个位于按钮上方.

  • 这个属性的名称是误导性的,但eclipse IDE提供了一个简短的描述:`如果视图将作为滚动容器设置此项,可以调整它以调整大小以缩小其整个窗口,以便为输入方法提供空间.[布尔]`.这意味着它没有按照名称所做的那样做,滚动行为将被保留 (12认同)

Usm*_*sar 63

要解决此问题,只需android:windowSoftInputMode="stateVisible|adjustPan在android清单文件中添加该活动即可.例如

<activity 
    android:name="com.comapny.applicationname.activityname"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateVisible|adjustPan"/>
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案对我有用.我的问题是我有两个线性布局使用layout_weight来分割屏幕,他们键盘会挤压它们.这是我的布局标签的样子.`<LinearLayout android:layout_width ="wrap_content"android:layout_height ="0dp"android:layout_weight ="1"android:orientation ="vertical">` (2认同)
  • 比将滚动视图设置为不是滚动视图更好的答案. (2认同)

Pet*_*tro 14

对于未来的读者.

我想要对这个问题进行具体控制,所以这就是我所做的:

从片段或活动中隐藏其他视图(键盘启动时不需要),然后将其还原以解决此问题:

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...
           view_one.setVisibility(View.GONE);
           view_two.setVisibility(View.GONE);

        } else {
           //ok now we know the keyboard is down...
           view_one.setVisibility(View.VISIBLE);
           view_two.setVisibility(View.VISIBLE);       
        }
     }
});
Run Code Online (Sandbox Code Playgroud)

  • 基本上adjustPan可以工作,但ScrollView不再起作用了.因此,要使用键盘*使ScrollView可滚动*,adjustResize是必要的.我在ViewPager中使用了你的解决方案(隐藏了较低的按钮),它似乎是唯一对我有用的解决方案.ScrollViews位于活动中不在的每个片段中.如果我把它放在活动中ViewPager开始出问题...... (2认同)

Abh*_*nav 6

windowSoftInputMode将平移或调整您的活动布局.您可以做的一件事是将onFocusChanged侦听器附加到EditText,当用户选择/点击EditText时,您可以隐藏或移动导航按钮.当EditText失去焦点时,您可以将导航按钮放回活动的底部.

  • 这不应该是必要的 - 您确定将windowSoftInput添加到*manifest*中的活动吗?http://stackoverflow.com/questions/4301422/android-showing-keyboard-moves-my-components-up-i-want-to-hide-them-instead (3认同)