android全屏下的输入框未跟随软键盘弹起问题

Posted ly570

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android全屏下的输入框未跟随软键盘弹起问题相关的知识,希望对你有一定的参考价值。

最近开发中遇到,全屏模式下输入框在底部不会跟随软键盘弹起。于是网上搜索了解决的方案。大致找到了两种方案。

第一种

定义好此类

public class SoftKeyBoardListener

private View rootView;//activity的根视图
int rootViewVisibleHeight;//纪录根视图的显示高度
private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;

public SoftKeyBoardListener(Activity activity)
//获取activity的根视图
rootView = activity.getWindow().getDecorView();

//监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
@Override
public void onGlobalLayout()
//获取当前根视图在屏幕上显示的大小
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);

int visibleHeight = r.height();
System.out.println(""+visibleHeight);
if (rootViewVisibleHeight == 0)
rootViewVisibleHeight = visibleHeight;
return;

//根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
if (rootViewVisibleHeight == visibleHeight)
return;

//根视图显示高度变小超过200,可以看作软键盘显示了
if (rootViewVisibleHeight - visibleHeight > 200)
if (onSoftKeyBoardChangeListener != null)
onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);

rootViewVisibleHeight = visibleHeight;
return;

//根视图显示高度变大超过200,可以看作软键盘隐藏了
if (visibleHeight - rootViewVisibleHeight > 200)
if (onSoftKeyBoardChangeListener != null)
onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);

rootViewVisibleHeight = visibleHeight;
return;


);

private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener)
this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;

public interface OnSoftKeyBoardChangeListener
void keyBoardShow(int height);

void keyBoardHide(int height);

public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener)
SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);


在Activity中实现

private SoftKeyBoardListener.OnSoftKeyBoardChangeListener changeListener = new SoftKeyBoardListener.OnSoftKeyBoardChangeListener()
@Override
public void keyBoardShow(int height)
//软键盘弹起,inputEt为底部输入框
ObjectAnimator animator = ObjectAnimator.ofFloat(inputEt, "translationY", 0, -height);
animator.setDuration(100);
animator.start();
edit.setFocusable(true);
edit.setFocusableInTouchMode(true);
edit.requestFocus();//获取焦点 光标出现

@Override
public void keyBoardHide(int height)
  //软键盘隐藏
ObjectAnimator animator = ObjectAnimator.ofFloat(inputEt, "translationY", -height, 0);
animator.setDuration(100);
animator.start();


;
第二种此方法在全屏模式webview的输入框被遮盖时可以解决。

public class KeyBoardListener

private Activity activity;
// private Handler mhanHandler;


private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;

private static KeyBoardListener keyBoardListener;


public static KeyBoardListener getInstance(Activity activity)
// if(keyBoardListener==null)
keyBoardListener = new KeyBoardListener(activity);
//
return keyBoardListener;


public KeyBoardListener(Activity activity)
super();
// TODO Auto-generated constructor stub
this.activity = activity;
// this.mhanHandler = handler;


public void init()

final FrameLayout content = (FrameLayout) activity
.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);

// content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
// int rootViewHeight;
// @Override
// public void onGlobalLayout()
// int viewHeight = content.getHeight();
// if (rootViewHeight != viewHeight)
// rootViewHeight = viewHeight;
// if (viewHeight == getRealHeight())
// //隐藏虚拟按键
// if (navigationListener != null)
// navigationListener.hide();
//
// else
// //显示虚拟按键
// if (navigationListener != null)
// navigationListener.show();
//
//
//
//
// );

mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener()
public void onGlobalLayout()
possiblyResizeChildOfContent();

);
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent
.getLayoutParams();



private void possiblyResizeChildOfContent()
int usableHeightNow = computeUsableHeight();
if (usableHeightNow != usableHeightPrevious)

int usableHeightSansKeyboard = 0;
if(getNavigationBarHeight(activity) == getRealHeight() - getHeight())
usableHeightSansKeyboard = getHeight();
else
usableHeightSansKeyboard = getRealHeight();

int heightDifference = usableHeightSansKeyboard - usableHeightNow;
if (heightDifference > (usableHeightSansKeyboard / 4))
// 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);


// private void showLog(String title, String msg)
// Log.d("Unity", title + "------------>" + msg);
//

/**
* 获取屏幕真实高度(包括虚拟键盘)
*/
public static int getRealHeight()
WindowManager windowManager = (WindowManager) MyApp.mApp.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
display.getRealMetrics(dm);
else
display.getMetrics(dm);

int realHeight = dm.heightPixels;

return realHeight;

/**
* 获取手机屏幕高度
*/
public static int getHeight()
WindowManager windowManager = (WindowManager) MyApp.mApp.getSystemService(Context.WINDOW_SERVICE);
LogUtil.e("height->",windowManager.getDefaultDisplay().getHeight() + "aa");
return windowManager.getDefaultDisplay().getHeight();

public static int getNavigationBarHeight(Activity activity)
Resources resources = activity.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height",
"dimen", "android");
//获取NavigationBar的高度
int height = resources.getDimensionPixelSize(resourceId);

return height;



在Activity中的实现:

KeyBoardListener.getInstance(this).init()
--------------------- 

以上是关于android全屏下的输入框未跟随软键盘弹起问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 软键盘上面 输入框弹起 计算软键盘高度法实现

Android 软键盘上面 输入框弹起 计算软键盘高度法实现

android 软键盘弹起怎么让view上移

Android 手机软键盘的弹起和关闭的监听

Android之监听手机软键盘弹起与关闭

H5如何对android和ios手机软键盘的监听