软键盘打开时调整布局

Eug*_*ene 37 android

我在一些应用程序中看到,当显示软键盘时,布局会发生变化.这当然不是adjustPan因为整个布局(可能是内部布局)的变化,而不仅仅是当前的变化EditText.例如,这是在Evernote登录屏幕中.你能告诉我这是怎么做的吗?

Ale*_*lov 66

这是一个类似于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();
}

}
Run Code Online (Sandbox Code Playgroud)

此布局侦听测量更改,如果新测量值<旧测量值,则表示屏幕的一部分被软键盘吃掉.

虽然,为了它的工作,在你的清单中你需要设置,android:windowSoftInputMode="adjustResize"所以内容将被调整大小而不仅仅是转移.

整个系统的工作原理如下:你有你的布局:

<MyLayout id="layout">
  <SomeImage id="image"/>
  <SomeText>
  <SomeInput>
</MyLayout>
Run Code Online (Sandbox Code Playgroud)

这就像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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

然后转到manifest.xml并设置

android:windowSoftInputMode="adjustResize"
Run Code Online (Sandbox Code Playgroud)

会发生什么,当显示软键盘时,它会隐藏图像并调整其余内容的大小.(您实际上可以看到如何在Evernote中调整文本大小)

当然,隐藏图像是您可以做的许多事情之一.但是你必须要小心,因为不同的布局变化也会调用onMeasure.

当然这是一个肮脏的变种.您需要检查方向变化,以及实际进行测量时的正确时间,以及在将新规格与旧规格进行比较时可能需要更多逻辑.但我认为这是唯一的方法.

  • 这有时会有一些错误.这个版本更好:http://stackoverflow.com/questions/2150078/android-is-software-keyboard-shown/4737265#4737265 (4认同)
  • 在Galaxy S4上无法正常工作.要纠正需要更改if(oldSpec> newSpec).. else ...用if(oldSpec <newSpec)替换'else'.当测量保持不变时,当前代码触发onHidden(). (3认同)

naX*_*aXa 9

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

<activity
    ...
    android:windowSoftInputMode="adjustResize" />
Run Code Online (Sandbox Code Playgroud)

文档:

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

"adjustPan"
活动的主窗口未调整大小以便为软键盘腾出空间.相反,窗口的内容会自动平移,以便键盘不会遮挡当前焦点,用户可以随时看到他们正在键入的内容.这通常比调整大小更不合适,因为用户可能需要关闭软键盘以获得窗口的模糊部分并与其交互.