Android开发总结笔记 EditText(输入框) 1-1-7

来源:互联网 发布:做微商网络爆款赚钱吗 编辑:程序博客网 时间:2024/06/11 15:02

由EditText的继承结构可以看出,EditText是在TextView的基础上拓展的。
而且在API文档中可以看出,EditText的属性几乎都是来自于TextView的

下面就来看一下EditText的一些常用的属性

1、文本输入提示
android:hint="帐号"
android:textColorHint="#fffff"
在输入框没有内容的时候
android:hint属性会显示出来,用于提示用户此处需要输入的内容
android:textColorHint则是设置hint的文本颜色


2、获取焦点后选中全部内容
android:selectAllOnFocus="true"
当EditText获取焦点后,自动选中全部内容。方便用户对内容进行重新编辑    


3、限制用户输入的内容类型
android:inputType="text"
可以选属性值

android:inputType="none"
android:inputType="text"
android:inputType="textCapCharacters"
android:inputType="textCapWords"
android:inputType="textCapSentences"
android:inputType="textAutoCorrect"
android:inputType="textAutoComplete"
android:inputType="textMultiLine"
android:inputType="textImeMultiLine"
android:inputType="textNoSuggestions"
android:inputType="textUri"
android:inputType="textEmailAddress"
android:inputType="textEmailSubject"
android:inputType="textShortMessage"
android:inputType="textLongMessage"
android:inputType="textPersonName"
android:inputType="textPostalAddress"
android:inputType="textPassword"
android:inputType="textVisiblePassword"
android:inputType="textWebEditText"
android:inputType="textFilter"
android:inputType="textPhonetic"
android:inputType="number"
android:inputType="numberSigned"
android:inputType="numberDecimal"
android:inputType="phone"
android:inputType="datetime"
android:inputType="date"
android:inputType="time"

4、光标位置的控制
  • setSelection(int start)    设置光标的位置
  • setSelection(int start,int end)    设置选中部分
  • setCursorVisible(boolean isVisible)   设置光标是否显示
  • getSelectionStart()和getSelectionEnd   获得当前光标的位置  


5、输入法的问题
既然是输入框,那就跟输入法会有些联系。下面就来看下EditText跟输入法之间的一些问题

①一般进入一个界面之后,如果有EditText,默认第一个就会获得焦点。

解决方法:给EditText所在的布局设置以下两个属性即刻
android:focusable="true"
android:focusableInTouchMode="true"
    
②让EditText获取焦点和清除焦点
    editText.clearFocus()
    editText.requestFoucs()

③隐藏输入法
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
mm.hideSoftInputFromWindow(view.getWindowToken(), 0);

据说有些机型不可用

④影响Activity和输入法键盘交互的属性
android:windowSoftInputMode
属性值(可用"|"符号间隔并使用多个)
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
stateHidden:用户选择activity时,软键盘总是被隐藏
stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
stateVisible:软键盘通常是可见的
stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分


修改软键盘右下角的显示文本
android:imeOptions

属性值
  • actionUnspecified  未指定,对应常量EditorInfo.IME_ACTION_UNSPECIFIED.
  • actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE 
  • actionGo 去往,对应常量EditorInfo.IME_ACTION_GO 
  • actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH 
  • actionSend 发送,对应常量EditorInfo.IME_ACTION_SEND 
  • actionNext 下一个,对应常量EditorInfo.IME_ACTION_NEXT 
  • actionDone 完成,对应常量EditorInfo.IME_ACTION_DONE 

 给右下角按钮设置响应事件
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE){    //此处加"||"条件actionId==KeyEvent.ACTION_DOWN
Toast.makeText(MainActivity.this, v.getText().toString(),Toast.LENGTH_LONG).show();
}
return false;
}
});
问题
网上有人说如果输入法是不是内置的,可能会导致无响应。为了以防万一,贴上解决办法

多添加一个KeyEvent监听器
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {
    
  if (KeyEvent.KEYCODE_ENTER == keyCode && event.getAction() == KeyEvent.ACTION_DOWN) {
     //业务代码
    return true;
  }
  return false;
  }
});



⑤带有删除键的EditText的
public class ClearEditText extends EditText implements
View.OnFocusChangeListener {
private Drawable imgEnable;
private Context context;
 
public ClearEditText(Context context) {
super(context);
this.context = context;
init();
}
 
public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
init();
}
 
public ClearEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
init();
}
 
private void init() {
// 获取图片资源
imgEnable = context.getResources().getDrawable(R.drawable.edit_delete);
addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
 
}
 
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
 
@Override
public void afterTextChanged(Editable s) {
setDrawable();
}
});
setDrawable();
}
 
/**
* 设置删除图片
*/
private void setDrawable() {
if (length() == 0) {
setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
} else {
setCompoundDrawablesWithIntrinsicBounds(null, null, imgEnable, null);
}
}
 
/**
* event.getX() 获取相对应自身左上角的X坐标 event.getY() 获取相对应自身左上角的Y坐标 getWidth()
* 获取控件的宽度 getTotalPaddingRight() 获取删除图标左边缘到控件右边缘的距离 getPaddingRight()
* 获取删除图标右边缘到控件右边缘的距离 getWidth() - getTotalPaddingRight() 计算删除图标左边缘到控件左边缘的距离
* getWidth() - getPaddingRight() 计算删除图标右边缘到控件左边缘的距离
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (imgEnable != null && event.getAction() == MotionEvent.ACTION_UP) {
int x = (int) event.getX();
// 判断触摸点是否在水平范围内
boolean isInnerWidth = (x > (getWidth() - getTotalPaddingRight()))
&& (x < (getWidth() - getPaddingRight()));
// 获取删除图标的边界,返回一个Rect对象
Rect rect = imgEnable.getBounds();
// 获取删除图标的高度
int height = rect.height();
int y = (int) event.getY();
// 计算图标底部到控件底部的距离
int distance = (getHeight() - height) / 2;
// 判断触摸点是否在竖直范围内(可能会有点误差)
// 触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标
boolean isInnerHeight = (y > distance) && (y < (distance + height));
if (isInnerWidth && isInnerHeight) {
setText("");
}
 
}
 
return super.onTouchEvent(event);
}
 
@Override
protected void finalize() throws Throwable {
super.finalize();
}
 
@Override
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
Log.i("fuck", hasFocus + "");
if (hasFocus) {
setDrawable();
} else {
setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
}
}
 
}


6、圆角编辑框

很多app都会采用圆角的方式来对登录框进行修饰。下面要实现一下


round_corner_bottom.xml
<?xml version="1.0" encoding="UTF-8"?>
 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
 
<item>
<shape android:padding="10dp" >
<solid android:color="@android:color/white" />
 
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp" />
 
<stroke
android:width="1dp"
android:color="@android:color/darker_gray" />
</shape>
</item>
<item
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="0dp">
<shape>
<solid android:color="@android:color/white" />
 
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp" />
 
<stroke android:width="1dp" />
</shape>
</item>
 
</layer-list>

round_corner_top.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
 
<item>
<shape android:padding="10dp" >
<solid android:color="@android:color/white" />
 
<stroke
android:width="1dp"
android:color="@android:color/darker_gray" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="1dp">
<shape>
<solid android:color="@android:color/white" />
 
<stroke android:width="1dp" />
</shape>
</item>
 
</layer-list>

activity_main.xml
<EditText
android:background="@drawable/round_corner_top"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:background="@drawable/round_corner_bottom"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
效果图



layer-list的功能类似于FrameLayout,上面item的会被下面item的覆盖
这里之所以用到这个layer-list是用于控制两个EditText之间的那条线的粗细

setHorizontalScrolling(true)   设置EditText不换行







0 0