Android关于adjustResize无效,监听软键盘的隐藏显的解决方案

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主题。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Android系统提供的软键盘监听器和输入法管理器来实现根据EditText位置软键盘的功能。具体步骤如下: 1. 在Activity中注册软键盘监听器: ```java InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.addOnSoftInputChangedListener(onSoftKeyboardChangeListener); ``` 2. 实现软键盘监听器,根据EditText位置动态调整软键盘示位置: ```java private final OnSoftKeyboardChangeListener onSoftKeyboardChangeListener = new OnSoftKeyboardChangeListener() { @Override public void onSoftKeyboardShow(int height) { Rect rect = new Rect(); editText.getGlobalVisibleRect(rect); int screenHeight = getResources().getDisplayMetrics().heightPixels; int keyboardHeight = screenHeight - rect.bottom; if (keyboardHeight > 0) { // 软键盘弹出 scrollView.scrollBy(0, keyboardHeight); } } @Override public void onSoftKeyboardHide() { // 软键盘隐藏 scrollView.scrollTo(0, 0); } }; ``` 其中,onSoftKeyboardShow()方法在软键盘弹出时被调用,可以根据EditText的位置动态调整ScrollView的滚动位置,使EditText可见;onSoftKeyboardHide()方法在软键盘隐藏时被调用,可以将ScrollView滚动回原来的位置。 需要注意的是,在AndroidManifest.xml文件中需要为Activity添加以下属性,以确保软键盘监听器能够正常工作: ```xml <activity android:windowSoftInputMode="adjustResize" /> ``` 这样,当软键盘弹出时,系统会自动调整Activity的布局大小,以便软键盘和EditText能够同时示在屏幕上。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值