Android输入框的联动控制

/** * 对一些含有两个输入框和一个确认按钮的页面,比如登录注册页面,一般是一个账号输入框、一个密码输入框、以及一个确认按钮。* 点击第二个输入框弹出键盘时,键盘常常会把确认按钮给遮挡住,这时,我们常常要求将确认按钮框上移至输入框之上,以避免遮挡确认按钮。* 下面三个类即实现了此种功能,代码独立,用法简单快捷** 1. 一个输入框时:
* new SoftInputOneEdtCtrl(your FragmentActivity).register(View viewBaseline, View viewToMove, EditText editText);

* 2. 两个输入框时:* new SoftInputTwoEdtCtrl(your FragmentActivity).register(View viewBaseline, View viewToMove, EditText edt1, EditText edit2);
*/
import android.graphics.Rect;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.EditText;

public abstract class SoftInputCtrlAbs
        implements OnLayoutChangeListener, OnGlobalLayoutListener, Runnable {

    protected FragmentActivity mActivity;

    private volatile int mNewBottom;
    private volatile int mOldBottom;

    protected View mViewBaseline;
    protected View mViewToMove;

    protected volatile boolean mHasMovedUp = false;

    private Handler mHandler = new Handler();

    public SoftInputCtrlAbs(FragmentActivity activity) {
        mActivity = activity;
        View rootView = mActivity.getWindow().findViewById(android.R.id.content);
        rootView.addOnLayoutChangeListener(this);
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    public void register(View viewBaseline, View viewToMove, EditText... editTexts) {
        mViewToMove = viewToMove;
        mViewBaseline = viewBaseline;
    }

    public void unregister() {
        if (mActivity != null) {
            View rootView = mActivity.getWindow().findViewById(android.R.id.content);
            rootView.removeOnLayoutChangeListener(this);
            rootView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
        reset();
    }

    public void postMove() {
        if (mHandler != null) {
            mHandler.post(this);
        }
    }

    @Override
    public void run() {
        moveUp();
    }

    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
            int oldTop, int oldRight, int oldBottom) {
        mNewBottom = bottom;
        mOldBottom = oldBottom;
    }

    public int getNewBottom() {
        return mNewBottom;
    }

    public int getOldBottom() {
        return mOldBottom;
    }

    protected synchronized void moveUp() {
        if (mViewToMove == null || mViewBaseline == null) return;
        int[] locationViewBaseline = new int[2];
        mViewBaseline.getLocationOnScreen(locationViewBaseline);
        int[] locationViewToMove = new int[2];
        mViewToMove.getLocationOnScreen(locationViewToMove);
        Rect rectViewToMove = new Rect();
        mViewToMove.getGlobalVisibleRect(rectViewToMove);

        int moveTopDistance = rectViewToMove.bottom - locationViewBaseline[1] - mViewBaseline
                .getHeight();

        if (moveTopDistance > 0 || mHasMovedUp) return;
        if (moveTopDistance < 0) {
            mHasMovedUp = true;
        }
        mViewToMove.setPadding(mViewToMove.getPaddingLeft(), moveTopDistance,
                mViewToMove.getPaddingRight(), mViewToMove.getPaddingBottom());
    }

    public void reset() {
        mViewToMove = null;
        mViewBaseline = null;
        mNewBottom = 0;
        mOldBottom = 0;
        mHasMovedUp = false;
        mActivity = null;
    }

    public void resetPosition () {
        if (mViewToMove != null) {
            mViewToMove.setPadding(mViewToMove.getPaddingLeft(), 0, mViewToMove.getPaddingRight(),
                    mViewToMove.getPaddingBottom());
            mHasMovedUp = false;
        }
    }
}
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.EditText;

public class SoftInputOneEdtCtrl extends SoftInputCtrlAbs {

    public SoftInputOneEdtCtrl(FragmentActivity activity) {
        super(activity);
    }

    @Override
    public void register(View viewBaseline, View viewToMove, EditText... editTexts) {
        super.register(viewBaseline, viewToMove, editTexts);
    }

    @Override
    public void unregister() {
        super.unregister();
    }

    @Override
    public void onGlobalLayout() {
        int bottom = getNewBottom();
        int oldBottom = getOldBottom();

        if (bottom < oldBottom) {
            postMove();
        } else if (bottom > oldBottom) {
            resetPosition();
        }
    }
}
import android.support.v4.app.FragmentActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

public class SoftInputTwoEdtCtrl extends SoftInputCtrlAbs{

    private static String TAG = "SoftInputTwoEdtCtrl";

    private EditText mEdtFirst;
    private EditText mEdtSecond;

    private boolean mEdtActionNext = false;
    private boolean mEdtSecondHasFocus = false;

    private OnEditorActionListener mOnEditorActionListener = new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_NEXT) {
                performActionNextEdtFirst();
            }
            return false;
        }
    };

    public SoftInputTwoEdtCtrl(FragmentActivity activity) {
        super(activity);
    }

    private synchronized void performActionNextEdtFirst() {
        mEdtActionNext = true;
        postMove();
    }

    @Override
    public void register(View viewBaseline, View viewToMove, EditText... editTexts) {
        super.register(viewBaseline, viewToMove, editTexts);
        if ( editTexts == null|| editTexts.length != 2) return;
        mEdtFirst = editTexts[0];
        mEdtSecond = editTexts[1];
        mEdtActionNext = false;
        mEdtSecondHasFocus = false;

        mEdtSecond.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                mEdtSecondHasFocus = hasFocus;
                postMove();
            }
        });
        mEdtFirst.setOnEditorActionListener(mOnEditorActionListener);
    }

    @Override
    public void onGlobalLayout() {
        int bottom = getNewBottom();
        int oldBottom = getOldBottom();

        if (bottom < oldBottom) {
            if (!mEdtSecondHasFocus) return;
            postMove();

        } else if (bottom > oldBottom) {
            resetPosition();

        } else if (mEdtActionNext && mEdtSecondHasFocus) {
            mEdtActionNext = false;
        }
    }

    @Override
    public void moveUp() {
        super.moveUp();
    }

    @Override
    public void reset() {
        super.reset();
        mEdtFirst = null;
        mEdtSecond = null;

        mEdtActionNext = false;
        mEdtSecondHasFocus = false;
    }
}
时间: 2024-10-12 08:29:17

Android输入框的联动控制的相关文章

Android 输入框限制字符输入数

有时候对Android的输入框有字符输入数量的限制,并且显示显示字符输入的数量.通过以下方式可以实现: 1.子定义LimitNumEditText继承EditText import android.content.Context; import android.content.res.TypedArray; import android.telephony.SmsMessage; import android.text.Editable; import android.text.InputFil

【Android】android 输入框EditText禁止输入Emoji表情符

转载地址:http://blog.csdn.net/elsdnwn/article/details/45390771 package com.liujy.ui.wiget;import android.content.Context;import android.text.Editable;import android.text.Selection;import android.text.Spannable;import android.text.TextWatcher;import andro

Android 输入框弹出样式

在androidMainfest.xml文件里 在Activity中设置 [A]stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 [B]stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,不管是隐藏还是显示 [C]stateHidden:用户选择activity时,软键盘总是被隐藏 [D]stateAlwaysHidden:当该Activity主窗体获取焦点时,软键盘也总是被隐藏的 [E

&lt;Android&gt;监听软键盘打开收起事件(软键盘自带收起按钮)

最近在公司开发cocos2dx上的android输入框控件,遇到软键盘的事件监听,通常软键盘的收起方式大致3种: 1.点击软键盘右下角的Return按钮(系统收起) 2.输入框焦点时按返回按钮(系统收起) 3.点击软键盘和输入框的外部(自发收起) 4.点击软键盘自带的收起按钮(软键盘收起) 前三种事件可以监听,方式都比较简单 1.点击软键盘右下角的Return按钮 给输入框设置监听 editText.setOnEditorActionListener(new OnEditorActionList

安卓常用实用功能代码片大全(长期更新)

看别人博客,有些小技巧就直接转过来了,以后做开发可以大大提高开发效率.以下代码片摘自多个博客和自己平时的学习积累,若原作者认为侵犯著作权,请私信告知,我看到后讲第一时间删除. 一.  获取系统版本号: PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0); int versionCode=nfo.versionCode string versionName=info.version

#h5软键盘兼容方案

h5软键盘兼容方案 本人在做公司项目的时候,在h5上调用键盘,发现了许多问题,主要问题总结如下 1.在 Android 和 IOS 上,键盘弹出收起在页面 webview 里表现不同. // 判断设备类型 var judgeDeviceType = function () { var ua = window.navigator.userAgent.toLocaleLowerCase(); var isIOS = /iphone|ipad|ipod/.test(ua); var isAndroid

Android 带清除功能的输入框控件EditText

今天学习了自定义控件,然后自己做了一个用户登录小控件EditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,但是Android原生EditText不具备此功能,所以要想实现这一功能我们需要重写EditText. 先说明一下,我是用Android studio写的,代码已经共享到我的github上了,有需要的可以去下载. 我们可以为我们的输入框在上下左右设置图片,所以我们可以利用属性android:drawableRight设置我们的删除小图标,如

android 弹出框(输入框和选择框)

1.输入框: final EditText inputServer = new EditText(this); inputServer.setFilters(new InputFilter[]{new InputFilter.LengthFilter(50)}); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("个性点的签名").setIcon(android.R.drawab

Android WebView 输入框键盘不弹出

问题 在Android中使用内嵌的WebView加载HTML网页时,如果html页面中存在输入框.那么在有些手机设备中,当输入框获取焦点时,系统输入法键盘无法正确弹出,从而无法完成正常的输入要求 在做APP时,自己也遇到了这个问题,以下是自己解决的方法,有可能不适合大家所遇到的情况,但值得借鉴~ WebView设置问题 有些时候我们设计的html页面并不能够很好的适应WebView,尤其我们的html页面是为PC浏览器设计的时候,当使用WebView来加载时,界面很可能会发生错乱,当input输