这是一个类似于 Evernote 登录屏幕的解决方案:
首先,定义一个类,它是您的特殊 LinearLayout,如下所示:
public class MyLayout extends LinearLayout {
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyLayout(Context context) {
super(context);
}
private OnSoftKeyboardListener onSoftKeyboardListener;
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
if (onSoftKeyboardListener != null) {
final int newSpec = MeasureSpec.getSize(heightMeasureSpec);
final int oldSpec = getMeasuredHeight();
if (oldSpec > newSpec){
onSoftKeyboardListener.onShown();
} else {
onSoftKeyboardListener.onHidden();
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public final void setOnSoftKeyboardListener(final OnSoftKeyboardListener listener) {
this.onSoftKeyboardListener = listener;
}
public interface OnSoftKeyboardListener {
public void onShown();
public void onHidden();
}
}
这种布局会监听测量值的变化,如果新的测量值小于旧的测量值,这意味着屏幕的一部分被软键盘吃掉了。
不过,要使其正常工作,您需要在清单中设置 android:windowSoftInputMode="adjustResize",以便调整内容的大小而不仅仅是移动。
整个系统的工作原理如下:
你有你的布局:
<MyLayout id="layout">
<SomeImage id="image"/>
<SomeText>
<SomeInput>
</MyLayout>
这就像evernotes 登录屏幕。
然后,在您的活动中:
((MyLayout)findViewById(R.id.layout)).setOnSoftKeyboardListener(new OnSoftKeyboardListener() {
@Override
public void onShown() {
findViewById(R.id.image).setVisibility(View.GONE);
}
@Override
public void onHidden() {
findViewById(R.id.image).setVisibility(View.VISIBLE);
}
});
然后去manifest.xml中设置
android:windowSoftInputMode="adjustResize"
会发生什么,当软键盘显示时,它会隐藏图像并调整其余内容的大小。 (您实际上可以在 Evernote 中看到文本是如何调整大小的)
当然,图像隐藏是您可以做的众多事情之一。但是一定要小心,因为不同的布局变化也会调用onMeasure。
当然这是一个肮脏的变种。您需要检查方向变化,以及实际进行测量的正确时间,以及在将新规格与旧规格进行比较时可能需要更多逻辑。但我认为这是唯一的方法。