Hi,大家好。
本人第一次写Blog,先输出个Hello World。欢迎老鸟指点哦
点进这个链接的朋友相信大部分都想第一时间看到解决方案吧,就不废话了。进入正题
<activity android:name=".MainActivity"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"android:windowSoftInputMode="adjustResize|stateVisible" android:screenOrientation="portrait" />
设置了 adjustResize 在Activity中却没有任何作用,不会出现想象中的结果。
adjustResize 软键盘出来时,挤压布局
为什么会无效呢?
其实这个原因是属于Android系统的一个Bug,Google到了现在还没解决。既然是系统的,具体原因就需要了问Google
。
这个问题会在设置 Activity 为全屏时出现。
注意:
1、Android 版本 >= 18时,并且配置
<
item
name=
"android:windowTranslucentStatus"
>true</
item
>
。
2、Android 版本 >= 21时,使用了Material主题。
以上2个原因会变相的导致Activity为全屏,所以也会出现布局没有任何反应的情况。
既然它不给我们改变布局,那我们就自己去改变布局。
里面还带了键盘 显示与隐藏的监听,亲测可靠。
解决方案
在Activity.setContentView()调用assistActivity方法即可,如下:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AndroidBugsSolution.assistActivity(this, this); }
import android.app.Activity; import android.graphics.Rect; import android.os.Build; import android.view.View; import android.view.ViewTreeObserver; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; /** * Created by husj1 on 2015/7/7. */ public class AndroidBugsSolution { // For more information, see https://code.google.com/p/android/issues/detail?id=5497 // To use this class, simply invoke assistActivity() on an Activity that already has its content view set. /** * 关于 全屏Activity adjustResize属性无效解决方案 * 在Activity setContentView 之后调用 * * @param activity * @param listener 软键盘显示隐藏监听, 可以为空 */ public static void assistActivity(Activity activity, OnKeyboardListener listener) { boolean subOffset = false; if (Build.VERSION.SDK_INT < 18) { subOffset = true; } new AndroidBugsSolution(activity, subOffset, listener); } private boolean mSubOffset; private int mCurrHeight; private Rect mRootRect; private View mContentView; private LayoutParams mLayoutParams; private OnKeyboardListener mListener; /** * * @param activity * @param isSubOffset 是否需要偏移 * @param listener 软键盘监听 监听隐藏,显示 */ private AndroidBugsSolution(final Activity activity, boolean isSubOffset, OnKeyboardListener listener) { this.mSubOffset = isSubOffset; this.mListener = listener; this.mContentView = ((FrameLayout) activity.findViewById(android.R.id.content)).getChildAt(0); this.mLayoutParams = (LayoutParams) mContentView.getLayoutParams(); this.mContentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { possiblyResizeChildOfContent(); } }); activity.getWindow().getDecorView().getRootView().getWindowVisibleDisplayFrame(mRootRect = new Rect()); } private void possiblyResizeChildOfContent() { Rect r = new Rect(); mContentView.getWindowVisibleDisplayFrame(r); int usableHeightNow = r.height(); // Log.i("III", "usableHeightNow " + usableHeightNow + ", r " + r.toString()); if (usableHeightNow != mCurrHeight) { int usableHeightSansKeyboard = r.bottom; if(mSubOffset) { usableHeightSansKeyboard -= r.top; } // android.util.Log.i("III", "usableHeightSansKeyboard " + usableHeightSansKeyboard + ", r " + r.toString()); // keyboard probably just became hidden mLayoutParams.height = usableHeightSansKeyboard; if (mListener != null) { if (mRootRect.bottom != r.bottom) { mListener.onKeyboardChanged(OnKeyboardListener.SHOW); } else { mListener.onKeyboardChanged(OnKeyboardListener.HIDE); } } mContentView.requestLayout(); mCurrHeight = usableHeightNow; } } public interface OnKeyboardListener { int SHOW = 1; int HIDE = 0; void onKeyboardChanged(int state); } }
以上代码基本可以解决问题,如果有问题,可以留言哦。
这个问题会在 Activity 为全屏时出现。
注意:
1、Android 版本 >= 18时,并且配置
<
item
name=
"android:windowTranslucentStatus"
>true</
item
>。
时,
其实这个时候,Activity可以说是也全屏的,所以也会出现这个问题。
2、Android版本 >= 21时,使用了Material主题。