继承困境: 我正在显示一个屏幕,其中包含3个输入字段和2个按钮(总共有3个标签,它们位于屏幕的底部)。 2个按钮设置在屏幕的左下方和右下方,位于选项卡的正上方。当我点击输入字段时,标签和按钮都被推到键盘顶部。
我希望只按下按钮,并将标签保留在原来的位置,在底部。我想在确定软键盘显示后将标签的可见性设置为GONE,并在软键盘消失后显示可见性。
是否有某种类型的软键盘监听器,或者输入字段?可能是OnFocusChangeListener
对编辑文本有些棘手的使用?如何确定键盘是否可见?
答案 0 :(得分:5)
确定键盘是否显示是不可能的。
您可能希望使用清单中的windowSoftInputMode
xml标记将其全部禁用:http://developer.android.com/reference/android/R.attr.html#windowSoftInputMode。或者,您可以查看如何移除焦点以隐藏键盘:Hide soft keyboard on activity without any keyboard operations。
两者都不能完全解决您的问题。我记得读过一篇博文章强烈建议不要在屏幕顶部使用标签,而不是屏幕顶部,因为UI清晰度原因。我建议你跟进。
答案 1 :(得分:1)
据我所知,你不能。
但是,您可以监视布局的大小更改,并且由于键盘显示是调整大小的主要原因,您可能会认为键盘是否显示。
这是用于监控布局大小更改的示例代码。只需将此布局用作原始布局的父级,并使用其侦听器。如果高度降低,您可以假设显示键盘,如果它增加了,您可以假设它已关闭。
public class LayoutSizeChangedSensorFrameLayout extends FrameLayout {
public enum SizeChange {
HEIGHT_INCREASED, HEIGHT_DECREASED, WIDTH_INCREASED, WIDTH_DECREASED
}
public interface OnLayoutSizeChangedListener {
void onSizeChanged(EnumSet<SizeChange> direction);
}
private OnLayoutSizeChangedListener mLayoutSizeChangeListener;
public LayoutSizeChangedSensorFrameLayout(final Context context) {
super(context);
}
public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attributeSet) {
super(context, attributeSet);
}
public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mLayoutSizeChangeListener != null) {
final EnumSet<SizeChange> result = EnumSet.noneOf(SizeChange.class);
if (oldh > h)
result.add(SizeChange.HEIGHT_DECREASED);
else if (oldh < h)
result.add(SizeChange.HEIGHT_INCREASED);
if (oldw > w)
result.add(SizeChange.WIDTH_DECREASED);
else if (oldw < w)
result.add(SizeChange.WIDTH_INCREASED);
if (!result.isEmpty())
mLayoutSizeChangeListener.onSizeChanged(result);
}
}
public void setOnLayoutSizeChangedListener(final OnLayoutSizeChangedListener layoutSizeChangeListener) {
this.mLayoutSizeChangeListener = layoutSizeChangeListener;
}
public OnLayoutSizeChangedListener getOnLayoutSizeChangeListener() {
return mLayoutSizeChangeListener;
}
}
答案 2 :(得分:0)
这可能会有所帮助 http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html
键盘代码在这里,我稍微瞥了一眼但放弃了,我没有看到任何有用的广播,至少在这里。也许你可以在回购中找到较低级别的代码并找到一个有用的Intent发送。第一个linke可能会告诉你何时它变得可见,但我不知道如何判断它何时变得不可见。
答案 3 :(得分:0)
对我有用的解决方案-
ViewTreeObserver treeObserver = getViewTreeObserver();
if (treeObserver != null)
treeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int pHeight = getResources().getDisplayMetrics().heightPixels;
Rect visRect = new Rect();
viewGroup.getWindowVisibleDisplayFrame(visRect);
boolean keyboardVisible;
int keyboardHeight= pHeight-currentHeight;
if (keyboardHeight > (MIN_KEYBOARD_HEIGHT*pHeight))
{
TGVLog.d(debugTag, "keyboardVisible-- "+true);
keyboardVisible = true;
}
else
{
TGVLog.d(debugTag, "keyboardVisible-- "+false);
keyboardVisible = false;
}
}
});
答案 4 :(得分:-4)
在我的上一个应用程序中,我在显示软键盘方面遇到了一些问题,然后我在我的清单文件中使用了以下代码:
<activity android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation" android:name=".rate.Calculator"/>