我在一些应用程序中看到,当显示软键盘时,布局会发生变化.这当然不是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.
当然这是一个肮脏的变种.您需要检查方向变化,以及实际进行测量时的正确时间,以及在将新规格与旧规格进行比较时可能需要更多逻辑.但我认为这是唯一的方法.
在AndroidManifest.xml中使用"adjustResize"而不是"adjustPan"
<activity
...
android:windowSoftInputMode="adjustResize" />
Run Code Online (Sandbox Code Playgroud)
从文档:
"adjustResize"
活动的主窗口始终调整大小,以便为屏幕上的软键盘腾出空间."adjustPan"
活动的主窗口未调整大小以便为软键盘腾出空间.相反,窗口的内容会自动平移,以便键盘不会遮挡当前焦点,用户可以随时看到他们正在键入的内容.这通常比调整大小更不合适,因为用户可能需要关闭软键盘以获得窗口的模糊部分并与其交互.
| 归档时间: |
|
| 查看次数: |
62796 次 |
| 最近记录: |