打开软键盘时调整布局

在某些应用程序中,我发现在显示软键盘时布局会发生变化。 这当然不是adjustPan因为整个布局(可能是内部布局)不仅移动了当前的EditText 。 例如在Evernote登录屏幕中。 你能建议这是怎么做的?


这是一个像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。

当然这是一个肮脏的变体。 您需要检查方位变化,以及实际进行测量的正确时间,并且在比较新规格和旧规格时可能需要更多逻辑。 但我认为这是做到这一点的唯一方法。


在AndroidManifest.xml中使用“adjustResize”而不是“adjustPan”

<activity
    ...
    android:windowSoftInputMode="adjustResize" />

从文档:

“adjustResize”
该活动的主窗口始终调整大小,以便为屏幕上的软键盘腾出空间。

“adjustPan”
该活动的主窗口没有调整大小以为软键盘腾出空间。 相反,窗口的内容会自动平移,以便当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在键入的内容。 这通常不如调整大小,因为用户可能需要关闭软键盘才能与窗口的遮蔽部分进行交互。


希望它可以帮助你:

http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html

http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/

链接地址: http://www.djcxy.com/p/93423.html

上一篇: Adjust layout when soft keyboard is on

下一篇: android soft keyboard spoils layout when appears