我在每个活动的底部都有一组导航按钮。在某些活动中,我需要在其顶部搜索文本视图。但是,每当用户在textview中键入内容时,软键盘总是会向上推导我的导航按钮,即使它实际上没有阻止文本视图。它让我的UI看起来很有趣。如何强制我的导航按钮在不受软键盘推动的情况下保持静止?我试图设置Activity的windowSoftInputMode,但没有一个配置有帮助。
有什么建议吗? 感谢
答案 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
添加到android清单文件中的该活动即可。例如
<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;
}
});