Android edittext 切换焦点或获取焦点时 设置光标到最后一位
先说设置光标到最后一位的代码,其实很简单
editText.setSelection(editText.getText().length());
但是,我们经常用到的情况是,当edittext获取焦点时,光标会默认显示在第一位,需要将光标自动移动到最后一位,这时候就需要在监听事件中设置了
edittext 焦点监听 中设置光标位置
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if(b){
editText.setSelection(editText.getText().length());
}
}
});
如此,就能解决当edittext获取到焦点时,自动将光标移动到最后一位。
但是
如果我们遇到下图情况 该怎么处理
在编辑商品信息时,会有很多输入框要操作。难不成要每个edittext 都要设置一遍焦点监听事件?这样做岂不代码量越来愈多,且冗余
这样当然也可以,封装一个方法,统一设置减少代码量。
比如
private void setFocusLenth(Edittext... edits){
for(Edittext editText : edits){
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if(b){
editText.setSelection(editText.getText().length());
}
}
});
}
}
这样写就简单多了,而且代码简洁,不用重复用代码单独设置
别高兴的太早
如果项目里有大量的界面都包含很多的edittext编辑框,岂不是写这个也很麻烦。封装在父类中或者是单独的工具类虽然也能解决问题。但是我找到了一个更好的方法。那就是重写viewgroup的focusSearch方法
就用LinearLayout举例
public class FocusLinearlayout extends LinearLayout {
public FocusLinearlayout(Context context) {
super(context);
}
public FocusLinearlayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public FocusLinearlayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public FocusLinearlayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public View focusSearch(View focused, int direction) {
if(focused instanceof EditText){
EditText editText = ((EditText) focused);
//光标移入文件末尾
editText.setSelection(editText.getText().length());
}
return super.focusSearch(focused,direction);
}
}
声明一个自定义的类 继承viewgroup(具体是哪个控件可以自己定),然后重写focusSearch。一般切换edittext焦点,是通过键盘中的回车键来操作的,它会响应改方法,这就省去了焦点监听的设置。
这个用法只需要在xml文件中替换对应的viewgroup控件就可以了