像素,键盘,文本框控制

一.dp与px之间的转换

/**
 * 像素工具类
 */
public class PixelUtils {
    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     * @param context 上下文
     * @param dpValue dp值
     * @return px值
     */
    public static int dip2px(Context context,float dpValue){
        // 获取当前手机的像素密度
        float scale=context.getResources().getDisplayMetrics().density;
        // 四舍五入取整
        return (int)(dpValue*scale+0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     * @param context 上下文
     * @param pxValue px值
     * @return dp值
     */
    public static int px2dip(Context context,float pxValue){
        // 获取当前手机的像素密度
        float scale=context.getResources().getDisplayMetrics().density;
        // 四舍五入取整
        return (int)(pxValue/scale+0.5f);
    }

    /**
     *获得屏幕的宽度
     * @param context 上下文
     * @return 屏幕宽度
     */
    public static int getScreenWidth(Context context){
        // 从系统服务中获取窗口管理器
       WindowManager windowManager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics displayMetrics = new DisplayMetrics();
        // 从默认显示器中获取显示参数保存到dm对象中
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        // 返回屏幕的宽度数值
        return displayMetrics.widthPixels;
    }

    /**
     *获得屏幕的高度
     * @param context 上下文
     * @return 屏幕高度
     */
    public static int getScreenHeight(Context context){
        // 从系统服务中获取窗口管理器
        WindowManager windowManager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics displayMetrics = new DisplayMetrics();
        // 从默认显示器中获取显示参数保存到dm对象中
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        // 返回屏幕的高度数值
        return displayMetrics.heightPixels;
    }

    /**
     * 获得屏幕的像素密度
     * @param context 上下文
     * @return 屏幕像素密度
     */
    public static float getScreenDensity(Context context){
        // 从系统服务中获取窗口管理器
        WindowManager windowManager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics displayMetrics = new DisplayMetrics();
        // 从默认显示器中获取显示参数保存到dm对象中
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        // 返回屏幕的像素密度数值
        return displayMetrics.density;
    }
}

二.获取编辑框最大长度和关闭软键盘

/**
 * 控件工具类
 */
public class WidgetUtil {

    /**
     * 获取编辑框的最大长度,通过反射机制调用隐藏方法
     *
     * @param editText 文本控件
     * @return 长度
     */
    public static int getMaxLength(EditText editText) {
        int length = 0;
        try {
            InputFilter[] inputFilters = editText.getFilters();
            for (InputFilter filter : inputFilters) {
                Class<?> c = filter.getClass();
                if (c.getName().equals("android.text.InputFilter$LengthFilter")) {
                    Field[] f = c.getDeclaredFields();
                    for (Field field : f) {
                        if (field.getName().equals("mMax")) {
                            field.setAccessible(true);
                            length = (Integer) field.get(filter);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return length;
    }

    /**
     * 关闭所有键盘
     * @param act Activity
     */
    public static void hideAllInputMethod(Activity act) {
        // 从系统服务中获取输入法管理器
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm.isActive()) { // 软键盘如果已经打开则关闭之
            imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

    /**
     * 关闭一个控件的键盘
     * @param act Activity
     * @param view 控件
     */
    public static void hideOneInputMethod(Activity act, View view) {
        // 从系统服务中获取输入法管理器
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        // 关闭屏幕上的输入法软键盘
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
}

三.在输入文本达到指定长度时自动隐藏输入法

/**
 * 在输入文本达到指定长度时自动隐藏输入法
 */
public class HideTextWatcher implements TextWatcher {

    private EditText editText;//获取监听的控件
    private Activity activity;//获取视图对象
    private int maxLength; //编辑框的最大长度
    private CharSequence mStr; //文本串

    public HideTextWatcher(Activity activity, EditText editText) {
        super();
        this.activity = activity;
        this.editText = editText;
        // 通过反射机制获取编辑框的最大长度
        maxLength = WidgetUtil.getMaxLength(editText);
    }

    // 在编辑框的输入文本变化前触发
    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
    }

    // 在编辑框的输入文本变化时触发
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
        mStr = charSequence;
    }

    // 在编辑框的输入文本变化后触发
    public void afterTextChanged(Editable s) {
        if (mStr == null || mStr.length() == 0)
            return;
        if (mStr.length() == maxLength) {
            WidgetUtil.hideOneInputMethod(activity,editText);
        }
    }
}
 EditText editText = findViewById(R.id.edit);
 editText.addTextChangedListener(new HideTextWatcher(MainActivity.this,editText));

四.在输入回车符时自动跳到下一个控件

/**
 * 定义一个编辑框监听器,在输入回车符时自动跳到下一个控件
 */
public class JumpTextWatcher implements TextWatcher {
    private EditText thisView;  // 声明当前编辑框对象
    private EditText nextView; // 声明下一个编辑框对象

    public JumpTextWatcher(EditText thisText, EditText nextView) {
        super();
       this.thisView=thisText;
       this.nextView=nextView;
    }

    // 在编辑框的输入文本变化前触发
    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {}

    // 在编辑框的输入文本变化时触发
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) {}

    // 在编辑框的输入文本变化后触发
    public void afterTextChanged(Editable editable) {
        String str = editable.toString();
        // 发现输入回车符或换行符
        if (str.contains("\r") || str.contains("\n")) {
            // 去掉回车符和换行符
            thisView.setText(str.replace("\r", "").replace("\n", ""));
            // 让下一个视图获得焦点,即将光标移到下个视图
            nextView.requestFocus();
            // 方式一:直接调用EditText的setSelection方法
            nextView.setSelection(nextView.getText().length());
            // 方式二:调用Selection类的setSelection方法
            //Editable edit = nextView.getText();
            //Selection.setSelection(edit, edit.length());
        }
    }
}
EditText editText1 = findViewById(R.id.edit1);
EditText editText2 = findViewById(R.id.edit2);
editText1.addTextChangedListener(new JumpTextWatcher(editText1, editText2));
editText2.addTextChangedListener(new JumpTextWatcher(editText2, editText1));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值