下面是一个类似于 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。
当然,这是一个肮脏的变体。您需要检查方向变化,以及实际进行测量的正确时间,并且在将新规格与旧规格进行比较时可能需要更多逻辑。但我认为这是唯一的方法。