【问题】
android中,对于EditText来说,
想要实现效果:
在已经设置了Disable->不允许编辑的情况下
但是允许获得焦点->这样就可以被点击而获得焦点->别的可编辑的EditText就可以失去焦点->代码中有会相应失去焦点的处理
代码中设置如下:
//update for focusable or not
if(varIsEditable){
//deprecated
variableValueView.setEnabled(true);
variableValueView.setFocusable(true);
variableValueView.setFocusableInTouchMode(true);
variableValueView.setOnFocusChangeListener(mFocusChangedListener);
}
else{
variableValueView.setEnabled(false);
variableValueView.setFocusable(true);
variableValueView.setFocusableInTouchMode(true);
//variableValueView.setOnFocusChangeListener(null);
variableValueView.setOnFocusChangeListener(mFocusChangedListener);
variableValueView.setKeyListener(null);
}但是结果却不起效果:
对于已经设置Enable为false的EditText
点击后,还是无法获得焦点。
【折腾过程】
1.参考:
看看EditText是否有setClickable,发现是有的,所以去打开:
//update for focusable or not
if(varIsEditable){
//deprecated
variableValueView.setEnabled(true);
variableValueView.setFocusable(true);
variableValueView.setFocusableInTouchMode(true);
variableValueView.setOnFocusChangeListener(mFocusChangedListener);
}
else{
variableValueView.setEnabled(false);
variableValueView.setClickable(true);
variableValueView.setFocusable(true);
variableValueView.setFocusableInTouchMode(true);
//variableValueView.setOnFocusChangeListener(null);
variableValueView.setOnFocusChangeListener(mFocusChangedListener);
variableValueView.setKeyListener(null);
}结果是:
问题依旧。
2.参考:
android – Disable EditText editability and focus (like TextView) – Stack Overflow
还是没用。
3.最后是采用了别的办法,去实现了所需要的效果:
确保EditText不可编辑的情况下,然后可以接收到点击事件(触屏事件)。
所用代码如下:
(1)代码中,设置不可编辑的EditText为Enable,但是setKeyListener为null
这样就无法输入,达到不允许编辑的效果了
接着再去设置setOnTouchListener,保证触屏后,可以进行后续处理
//update for focusable or not
if(varIsEditable){
//deprecated
variableValueView.setEnabled(true);
variableValueView.setFocusable(true);
variableValueView.setFocusableInTouchMode(true);
variableValueView.setOnFocusChangeListener(mFocusChangedListener);
}
else{
//variableValueView.setEnabled(false);
variableValueView.setEnabled(true);
variableValueView.setClickable(true);
variableValueView.setFocusable(true);
variableValueView.setFocusableInTouchMode(true);
//variableValueView.setOnFocusChangeListener(null);
variableValueView.setOnFocusChangeListener(mFocusChangedListener);
variableValueView.setKeyListener(null);
//variableValueView.setOnClickListener(mClickListener);
variableValueView.setOnTouchListener(mTouchListener);
}(2)然后去实现对应的:OnTouchListener
OnFocusChangeListener mFocusChangedListener;
OnClickListener mClickListener;
OnTouchListener mTouchListener;
mTouchListener = new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent me) {
if(isNonEditableEditText(v)){
//is non-editable EditText
EditText nonEditableEditText = (EditText)v;
View curView = getWindow().getCurrentFocus();
if(isEditableEditText(curView)){
//is editable EditText
EditText curEditText = (EditText)curView;
//clear focus
//curEditText.clearFocus();
//hidden inputmethod keyboard
//getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(curEditText.getWindowToken(), 0);
nonEditableEditText.requestFocus();
}
}
return true;
}
};在其中去处理:
当触屏后:
先去判断是否为可编辑的EditText
private boolean isEditableEditText(View v){
boolean isEditable = false;
EditText editText = null;
if(v != null){
if(v instanceof EditText){
editText = (EditText)v;
if(null != editText.getKeyListener()){
isEditable = true;
}
}
}
return isEditable;
}
private boolean isNonEditableEditText(View v){
boolean isNonEditable = false;
EditText editText = null;
if(v != null){
if(v instanceof EditText){
editText = (EditText)v;
if(null == editText.getKeyListener()){
isNonEditable = true;
}
}
}
return isNonEditable;
}可见,此处不是通过Enable去判断是否为可编辑的
->因为调试期间发现,如果
variableValueView.setEnabled(false);
则会导致后续的
variableValueView.setClickable(true); variableValueView.setFocusable(true); variableValueView.setFocusableInTouchMode(true);
都失效,从而导致无法监听对应的Click或Touch事件了。
所以此处才逼得只能先去Enable,然后再去设置setKeyListener(null)的;
此处是通过判断getKeyListener是否为空来确定是否可编辑的。
这样,就很凑合地,去实现了:
当点击了,不可编辑的EditText,可以捕获事件,
然后去处理后续事情的:
此处是:
隐藏当前获得的EditText,其是可编辑的,隐藏掉输入法;
然后对于新点击的,不可编辑的EditText,去获得对应的焦点;
这样后续在onFocusChange中:
mFocusChangedListener = new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
String labelStr = "";
if(AppConfig.getInstance().isDebugMode()){
RelativeLayout parentView = (RelativeLayout)v.getParent();
//LinearLayout parentView = (LinearLayout)v.getParent().getParent();
//LinearLayout parentView = (LinearLayout)v.getParent().getParent().getParent();
TextView labelView = (TextView) parentView.findViewById(R.id.variableLabel);
labelStr = (String) labelView.getText();
}
if(hasFocus){
//enter into edittext
if(AppConfig.getInstance().isDebugMode()){
//Toast.makeText(getApplicationContext(), "got focus: " + v.toString(), Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), "got focus: " + labelStr, Toast.LENGTH_SHORT).show();
updateCurrentMode();
}
else{
//when some EditText got focus, then should into EditMode
updateCurrentMode();
}
}else {
EditText valueView = (EditText)v;
//left edittext
if(AppConfig.getInstance().isDebugMode()){
//Toast.makeText(getApplicationContext(), "lost focus: " + v.toString(), Toast.LENGTH_LONG).show();
//for debug
Toast.makeText(getApplicationContext(), "lost focus: " + labelStr, Toast.LENGTH_SHORT).show();
updateCurrentMode();
}
else{
if(valueView.isEnabled()){
//only validate new value for editable value
if(mVarValueViewVarNameMap.containsKey(valueView)){
String varName = mVarValueViewVarNameMap.get(valueView);
String varValue = (String)valueView.getText().toString();
DeviceModelManager.getInstance().getCurrentDeviceModel().postValidateVariablesValue(varName, varValue);
}
}
}
}
}
};就可以执行对应的更新状态的事情了。
【总结】
目前还是无法实现:
在设置EditText为disable,不可编辑的情况下,获得焦点。
只能规避此问题,先EditText设置为Enable,然后setKeyListener为null,然后后续实现对应的Click或Touch的Listener去执行自己所需要的效果。。。
很是挫啊。。。
转载请注明:在路上 » 【workaround】Android中如何使得EditText在已经被Disable的情况下还能够获得焦点