【Android】EditText获得焦点以及失去焦点
2016-03-05 23:06
134 查看
【关键词】
【问题】
默认是居中显示且非编辑状态,点击EditText后文字居左且显示编辑状态;
编辑状态时,点击屏幕其他地方,使其失去焦点;
进入界面时EditText获取焦点问题(默认状态下不获取焦点);
非编辑状态无底线,编辑状态有底线加以区分;
【效果图】
【分析】
见源码及注释;
【解决方案】
默认让包含EditText的ViewGroup获取焦点;
【代码】
[javaactivity]
[xmllayout]
[et_name.xml]
[colors.xml]
【参考资料】
EditText
输入法
获得焦点
失去焦点
【问题】
默认是居中显示且非编辑状态,点击EditText后文字居左且显示编辑状态;
编辑状态时,点击屏幕其他地方,使其失去焦点;
进入界面时EditText获取焦点问题(默认状态下不获取焦点);
非编辑状态无底线,编辑状态有底线加以区分;
【效果图】
【分析】
见源码及注释;
【解决方案】
默认让包含EditText的ViewGroup获取焦点;
【代码】
[javaactivity]
privatevoidinitEtName(){
//使RelativeLayout获取焦点,防止EditText截取
finalRelativeLayoutrlytTimerName=(RelativeLayout)findViewById(R.id.rlyt_timer_name);
rlytTimerName.setFocusable(true);
rlytTimerName.setFocusableInTouchMode(true);
rlytTimerName.requestFocus();
finalEditTextetName;
etName=(EditText)findViewById(R.id.et_name);
etName.setOnClickListener(this);
etName.setOnFocusChangeListener(newView.OnFocusChangeListener(){
@Override
publicvoidonFocusChange(Viewv,booleanhasFocus){
if(hasFocus){
etNameGetFocus(etName);
}else{
etNameLostFocus(etName);
}
}
});
Stringname="Lou";
etName.setText(name);
etNameLostFocus(etName);
}
//重置edittext,居中并失去焦点
privatevoidetNameLostFocus(EditTextetName){
etName.setGravity(Gravity.CENTER);
etName.clearFocus();
InputMethodManagermanager=(InputMethodManager)etName.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(etName.getWindowToken(),0);
}
//获取焦点
privatevoidetNameGetFocus(finalEditTextetName){
etName.requestFocus();
etName.setGravity(Gravity.START);
etName.post(newRunnable(){
@Override
publicvoidrun(){
InputMethodManagermanager=(InputMethodManager)etName.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
manager.showSoftInput(etName,0);
}
});
//光标置于文字最后
etName.setSelection(etName.getText().length());
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.et_name:
//设置EditText的点击事件(如果处于编辑状态则,不做操作;否则,获取焦点进入可编辑状态);
EditTextet=(EditText)v;
if(!et.isCursorVisible()){
etNameGetFocus(et);
}
break;
}
}
//点击屏幕其他地方,使etName失去焦点(EditText)
@Override
publicbooleandispatchTouchEvent(MotionEventev){
if(ev.getAction()==MotionEvent.ACTION_DOWN){
//获取当前焦点所在的控件;
Viewview=getCurrentFocus();
if(view!=null&&viewinstanceofEditText){
Rectr=newRect();
view.getGlobalVisibleRect(r);
intrawX=(int)ev.getRawX();
intrawY=(int)ev.getRawY();
//判断点击的点是否落在当前焦点所在的view上;
if(!r.contains(rawX,rawY)){
view.clearFocus();
}
}
}
returnsuper.dispatchTouchEvent(ev);
}
[xmllayout]
<RelativeLayout
android:id="@+id/rlyt_timer_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:background="@drawable/et_name"
android:hint="Pleaseinputyourname"
android:maxLength="15"
android:maxLines="1"
android:paddingStart="8dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:text="HelloWorld"
android:textColor="@color/module_title_font"
android:textCursorDrawable="@null"
android:textSize="18sp"></EditText>
</RelativeLayout>
[et_name.xml]
<?xmlversion="1.0"encoding="utf-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:state_focused="true">
<layer-list>
<item>
<shapeandroid:shape="rectangle">
<solidandroid:color="@color/module_title_font"/>
</shape>
</item>
<itemandroid:bottom="8dp">
<shapeandroid:shape="rectangle">
<solidandroid:color="@color/main_content_bg"/>
</shape>
</item>
<itemandroid:bottom="1dp"
android:left="1dp"
android:right="1dp">
<shapeandroid:shape="rectangle">
<paddingandroid:left="2dp"android:right="2dp"/>
<solidandroid:color="@color/main_content_bg"/>
</shape>
</item>
</layer-list>
</item>
</selector>
[colors.xml]
<colorname="module_title_font">#c2c2c1</color>
<colorname="main_content_bg">#3c3c3b</color>
【参考资料】
相关文章推荐
- gridview position =0多次调用getView, 如果有异步加载,那会导致程序效率低,并且导致position=0的控件显示有问题
- Android使用 LruCache 缓存图片
- Android 第三天重置版_注意事项
- Android中design包中的新控件2
- Android自定义点击下拉列表
- android 数据文件存取至储存卡
- Android实现随触摸移动而变化的效果
- 利用泛型实现一个简单的android orm小例子
- android之textview属性介绍
- Android Material Design学习之四CardView
- Android中design包中的新控件1
- Android 隐藏API
- Android 短信的收发及在android模拟器之间实践
- android中Manifest讲解
- 二个android模拟器互发短信程序演示
- android 布局实例解析 格子菜单效果
- Android事件传递机制(二)
- Android学习笔记----实现强制下线功能
- 仿专题订阅功能
- Android事件传递机制(一)