当软键盘出现遮挡住布局后,如果修改成SOFT_INPUT_ADJUST_PAN
或SOFT_INPUT_ADJUST_RESIZE
依然解决不了想要的需求,那么下面这个就是最合适解决软键盘挡住的方案了。
解决方案大概要述:把布局修改成滑动式布局,当出现软键盘后,将最外面的布局高度缩至软键盘上面,并且整体布局依然可以保持滑动。
对本身代码侵略性也少,一句代码放在Activity即可。
@Override
protected void onCreate(Bundle savedInstanceState) {
```
Softkeyboard.assistActivity(rlContent);
```
}
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rlContent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/newui_title_bar" />
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/title_layout"
android:animateLayoutChanges="true"
android:orientation="vertical">
</ScrollView>
</RelativeLayout>
Softkeyboard
public class Softkeyboard {
// For more information, see https://issuetracker.google.com/issues/36911528
// To use this class, simply invoke assistActivity() on an Activity that already has its content view set.
public static void assistActivity(Activity activity) {
new Softkeyboard(activity);
}
public static void assistActivity(RelativeLayout rlContent) {
new Softkeyboard(rlContent);
}
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private Softkeyboard(Activity activity) {
FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(() -> possiblyResizeChildOfContent());
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}
private Softkeyboard(RelativeLayout rlContent) {
mChildOfContent = rlContent;
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(() -> possiblyResizeChildOfContent());
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}
private void possiblyResizeChildOfContent() {
int usableHeightNow = computeUsableHeight();
if (usableHeightNow != usableHeightPrevious) {
int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
int heightDifference = usableHeightSansKeyboard - usableHeightNow;
if (heightDifference > (usableHeightSansKeyboard / 5)) {
// keyboard probably just became visible
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
} else {
// keyboard probably just became hidden
frameLayoutParams.height = usableHeightSansKeyboard;
}
mChildOfContent.requestLayout();
usableHeightPrevious = usableHeightNow;
}
}
private int computeUsableHeight() {
Rect r = new Rect();
mChildOfContent.getWindowVisibleDisplayFrame(r);
return (r.bottom - r.top);
}
}
在这里对Softkeyboard的一段代码usableHeightSansKeyboard / 5
说一下,如果包含导航栏也加入滑动布局的话,就 usableHeightSansKeyboard / 4
网友评论