您的位置:首页 > 移动开发 > Android开发

【Android】EditText获得焦点以及失去焦点

2016-03-05 23:06 134 查看
【关键词】

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>

【参考资料】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: