软键盘开启时调整布局
在某些应用程序中,我发现在显示软键盘时布局会发生变化。 这当然不是adjustPan
因为整个布局(可能是内部布局)不仅仅是当前的EditText
。 这是例如在Evernotelogin屏幕。 你能build议这是怎么做的?
这是一个像Evernotelogin屏幕一样的解决scheme:
首先,定义一个类,这将是你的特殊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>
这就像evernoteslogin屏幕。 然后,在你的活动中:
((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”
该活动的主窗口不调整为软键盘腾出空间。 相反,窗口的内容会自动平移,以便当前的焦点永远不会被键盘遮挡,用户总是可以看到他们正在键入的内容。 这通常不如resize,因为用户可能需要closures软键盘才能与窗口的遮蔽部分进行交互。
希望它可以帮助你:
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/
这对我工作..这是你的oncreate
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
所选答案在全屏模式下不起作用。 以下一行解决scheme为我工作:
AndroidBug5497Workaround.assistActivity(this);
复制类AndroidBug5497Workaround从:
Android如何在软键盘可见时以全屏模式调整布局
在父级中的布局中使用滚动视图,并从清单文件中移除adjustpan或adjustresize设置。 在你的布局的滚动视图将给你免费的function来滚动你的平移或布局与给定的布局,并保护您的布局覆盖工具栏或操作栏,也不会隐藏布局中的button或文本框。 请记住,您必须在基本布局中使用ScrollView,因此此滚动视图将作为整个屏幕的基本布局。 例
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:scrollbarStyle="insideInset" android:scrollbars="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- Add here which you want --> </LinearLayout> </ScrollView>