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

时间:2011-04-01 16:32:35

标签: android android-layout

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

有什么建议吗? 感谢

7 个答案:

答案 0 :(得分:152)

我确实遇到了同样的问题,起初我补充道:

<activity
    android:name="com.companyname.applicationname"
    android:windowSoftInputMode="adjustPan">

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

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:isScrollContainer="false">
</ScrollView>
滚动视图中的

这对我有用。

答案 1 :(得分:71)

在我的情况下,按钮被推高的原因是因为它们上方的视图是ScrollView,并且无论android:windowSoftInputMode的值是什么,它都会在键盘上方按下按钮时折叠我正在设置。

我能够通过设置

来避免我的底部按钮被软键盘向上推
android:isScrollContainer="false" 
位于按钮上方的ScrollView上的

答案 2 :(得分:62)

要解决此问题,只需将android:windowSoftInputMode="stateVisible|adjustPan添加到a​​ndroid清单文件中的该活动即可。例如

<activity 
    android:name="com.comapny.applicationname.activityname"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateVisible|adjustPan"/>

答案 3 :(得分:13)

为未来的读者。

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

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

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

答案 4 :(得分:6)

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

答案 5 :(得分:0)

我遇到了同样的问题,但设置windowSoftInputMode没有帮助,我不想将上方视图更改为isScrollContainer="false"因为我希望它滚动。

我的解决方案是定义导航工具的顶部位置而不是底部。我正在使用Titanium,所以我不确定这将如何转化为android。定义导航工具视图的顶部位置会阻止软键盘向上推动,而是覆盖了我想要的导航控件。

答案 6 :(得分:-4)

通过设置淘气的EditText来解决它:

etSearch = (EditText) view.findViewById(R.id.etSearch);

etSearch.setInputType(InputType.TYPE_NULL);

etSearch.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        etSearch.setInputType(InputType.TYPE_CLASS_TEXT);
        return false;
    }
});