android:多个EditText页面滑动实现

    xiaoxiao2026-08-24  58

    方法1

    import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ScrollView; public class KeyWordUtils { /** * 弹出键盘时滚动到界面指定位置 * Created 2015-1-30 上午11:19:23 * @param activity * 当前Activity * @param lyRootID * 所在根布局ID * @param vID * 要滚动到的控件ID * @param svID * 控件所在ScrollView ID * @author gpy */ @SuppressLint("NewApi") public static void pullKeywordTop(final Activity activity,final int lyRootID,final int vID,final int svID,final int needHideId){ ViewGroup ly = (ViewGroup) activity.findViewById(lyRootID); //获取屏幕高度,根据经验,输入法弹出高度一般在屏幕1/3到1/2之间 final int defaultHeight = ((WindowManager)activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight(); final int mKeyHeight = defaultHeight/4; ly.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { //获取根布局前后高度差 int height = oldBottom-bottom; ScrollView sv = (ScrollView)activity.findViewById(svID); if(height>mKeyHeight) {//当高度差大于屏幕1/4,认为是输入法弹出变动,可能会有特殊机型会失败 activity.findViewById(needHideId).setVisibility(View.GONE); final int lybottom = bottom; sv.post(new Runnable() {//用post防止有时输入法会自动滚动覆盖我们手动滚动 @Override public void run() { ScrollView runSv = (ScrollView)activity.findViewById(svID); //获取要滚动至的控件到屏幕顶部高度 View v = (View)activity.findViewById(vID); int[] loca = new int[2]; 获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度。loca[0] x,loca[1] y v.getLocationOnScreen(loca); //这种通知栏高度获取方法必须在布局构建完毕后才能生效,否则获取为0 Rect frame = new Rect(); //getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。 activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); //获取状态栏高度 int statusBarHeight = frame.top; // 要滚动的距离=控件距屏幕顶部距离+控件高度-输入法弹出后的activity高度-通知栏高度 int scrollHeight = loca[1] + v.getHeight() - lybottom - statusBarHeight; if(scrollHeight>0){ runSv.scrollBy(0, scrollHeight); } } }); }else if(-height>mKeyHeight){//当输入法收起,回滚回顶部 sv.scrollTo(0,0); activity.findViewById(needHideId).setVisibility(View.VISIBLE); } } }); } }

    使用 ScrollView中包含LinearLayout,改LinearLayout中可放置多个edittext activity在配置文件中记得添加 android:windowSoftInputMode=”adjustResize|stateHidden”

    方法2

    在activity的底部加一个占位的View,当页面能测量控件高度时,每次键盘弹出后,增加占位View的高度。

    findViewById(R.id.ly_login).getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); //获取当前界面可视部分 OpenCunGuanActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r); //获取屏幕的高度 int screenHeight = OpenCunGuanActivity.this.getWindow().getDecorView().getRootView().getHeight(); //此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数 int heightDifference = screenHeight - r.bottom; CMLog.i("info", "软键盘高度:" + heightDifference + " 屏幕高度" + screenHeight + " 可视区域高度:" + r.bottom + " marginTop" + marginTop); // 在xml中设置hiddenView的高度,会导致部分界面超过一些低像素高度小的手机,已进入界面就可以滑动 if (r.bottom < screenHeight) { originalParams.height = heightDifference + marginTop * 3 / 5; hiddenView.setLayoutParams(originalParams); } else { originalParams.height = 0; hiddenView.setLayoutParams(originalParams); mSvContent.scrollTo(0, marginTop); } } });
    转载请注明原文地址: https://ju.6miu.com/read-1311529.html
    最新回复(0)