android 点击空白处收起键盘和自定义EditText实现右下角计数控件

一:点击空白处收起键盘

先看一下效果:

这里写图片描述

public class MainActivity extends AppCompatActivity {

    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.editText);

        setTouchListener(this);//只需调用这个方法即可
    }


    private static void setTouchListener(final Activity context) {
        context.getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                if (context.getCurrentFocus() != null) {
                    imm.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(), 0);
                } else {
                    imm.hideSoftInputFromWindow((context.findViewById(android.R.id.content)).getWindowToken(), 0);
                }
                return false;
            }
        });
    }
}

评:只是一个小功能,说不定以后会用的到。

Android提醒微技巧,你真的了解Dialog、Toast和Snackbar吗?

Android中一些你可能没注意的小效果实现

二:自定义EditText实现右下角计数控件

还是先上效果图:
这里写图片描述

R.layout.anfq_num_edittext 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/etContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@null"
        android:gravity="start"
        android:hint="请输入内容"
        android:paddingLeft="@dimen/spacing_small"
        android:paddingTop="@dimen/spacing_tiny"
        android:textSize="13sp"/>

    <TextView
        android:id="@+id/tvNum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        tools:text="200"/>

    <View
        android:id="@+id/vLine"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layout_alignParentBottom="true"
        android:background="@color/colorPrimary"
        android:visibility="gone"/>

</RelativeLayout>

关键代码,自定义view的实现:

import android.content.Context;
import android.graphics.Color;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class AnFQNumEditText extends RelativeLayout{
    //类型1(单数类型):TextView显示总字数,然后根据输入递减.例:100,99,98
    //类型2(百分比类型):TextView显示总字数和当前输入的字数,例:0/100,1/100,2/100
    public static final String SINGULAR = "Singular";//类型1(单数类型)
    public static final String PERCENTAGE = "Percentage";//类型2(百分比类型)
    private EditText etContent;//文本框
    private TextView tvNum;//字数显示TextView
    private View vLine;//底部横线
    private String TYPES = SINGULAR;//类型
    private int MaxNum = 100;//最大字符

    public AnFQNumEditText(Context context) {
        this(context, null);
    }

    public AnFQNumEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.anfq_num_edittext, this, true);
        etContent = (EditText) findViewById(R.id.etContent);
        tvNum = (TextView) findViewById(R.id.tvNum);
        vLine = findViewById(R.id.vLine);
    }

    /**
     * 设置显示
     * @return
     */
    public AnFQNumEditText show(){
        if(TYPES.equals(SINGULAR)){//类型1
            tvNum.setText(String.valueOf(MaxNum));
        }else if(TYPES.equals(PERCENTAGE)){//类型2
            tvNum.setText(0+"/"+MaxNum);
        }
        //设置长度
        etContent.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MaxNum)});
        //监听输入
        etContent.addTextChangedListener(mTextWatcher);
        return this;
    }

    /**
     * 设置横线颜色
     * @param color --颜色值
     * @return
     */
    public AnFQNumEditText setLineColor(String color){
        vLine.setBackgroundColor(Color.parseColor(color));
        return this;
    }

    /**
     * 设置类型
     * @param type --类型
     * @return
     */
    public AnFQNumEditText setType(String type){
        TYPES = type;
        return this;
    }

    /**
     * 设置最大字数
     * @param num --字数
     * @return
     */
    public AnFQNumEditText setLength(int num){
        this.MaxNum = num;
        return this;
    }

    /**
     * 设置文本框的Hint
     * @param str --设置内容
     * @return
     */
    public AnFQNumEditText setEtHint(String str){
        etContent.setHint(str);
        return this;
    }

    /**
     * 设置文本框的最小高度
     * @param px --最小高度(单位px)
     * @return
     */
    public AnFQNumEditText setEtMinHeight(int px){
        etContent.setMinHeight(px);
        return this;
    }


    /**
     * 感觉这个方法是核心方法
     * 
     */
    private TextWatcher mTextWatcher = new TextWatcher() {
        private int editStart;
        private int editEnd;
        public void afterTextChanged(Editable s) {
            editStart = etContent.getSelectionStart();
            editEnd = etContent.getSelectionEnd();
            // 先去掉监听器,否则会出现栈溢出
            etContent.removeTextChangedListener(mTextWatcher);
            // 注意这里只能每次都对整个EditText的内容求长度,不能对删除的单个字符求长度
            // 因为是中英文混合,单个字符而言,calculateLength函数都会返回1
            while (calculateLength(s.toString()) > MaxNum) { // 当输入字符个数超过限制的大小时,进行截断操作
                s.delete(editStart - 1, editEnd);
                editStart--;
                editEnd--;
            }
            // 恢复监听器
            etContent.addTextChangedListener(mTextWatcher);
            setLeftCount();
        }

        public void beforeTextChanged(CharSequence s, int start, int count,int after) {}

        public void onTextChanged(CharSequence s, int start, int before,int count) {}
    };

    /** 刷新剩余输入字数 */
    private void setLeftCount() {
        if(TYPES.equals(SINGULAR)){//类型1
            tvNum.setText(String.valueOf((MaxNum - getInputCount())));
        }else if(TYPES.equals(PERCENTAGE)){//类型2
            tvNum.setText(MaxNum-(MaxNum - getInputCount())+"/"+MaxNum);
        }

    }

    /** 获取用户输入内容字数 */
    private long getInputCount() {
        return calculateLength(etContent.getText().toString());
    }
    /**
     * 计算分享内容的字数,一个汉字=两个英文字母,一个中文标点=两个英文标点
     * 注意:该函数的不适用于对单个字符进行计算,因为单个字符四舍五入后都是1
     * @param cs
     * @return
     */
    public static long calculateLength(CharSequence cs) {
        double len = 0;
        for (int i = 0; i < cs.length(); i++) {
            int tmp = (int) cs.charAt(i);
            if (tmp > 0 && tmp < 127) {
                len += 1;
            } else {
                len++;
            }
        }
        return Math.round(len);
    }
}

MainActivity .java

public class MainActivity extends AppCompatActivity {

    private AnFQNumEditText customEdit;//一定要注意哦,这个是自定义View的类名称!我总是弄错。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        customEdit = (AnFQNumEditText) findViewById(R.id.custom_edit);
        customEdit.setEtHint("内容")//设置提示文字
                .setEtMinHeight(200)//设置最小高度,单位px
                .setLength(50)//设置总字数
                .setType(AnFQNumEditText.SINGULAR) //TextView显示类型(SINGULAR单数类型)(PERCENTAGE百分比类型)
                .setLineColor("#3F51B5")//设置横线颜色
                .show();

    }

声明:部分代码也是参考别人的代码再加上自己的一点小心得,希望对大家有所帮助。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值