一:点击空白处收起键盘
先看一下效果:
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();
}
声明:部分代码也是参考别人的代码再加上自己的一点小心得,希望对大家有所帮助。