問(wèn)題描述
我最近將 Android 設(shè)計(jì)庫(kù)從 24.2.1 升級(jí)到了 25.0.0.在此之后 EditText 中的drawableX"功能不起作用.
I recently upgraded Android Design library from 24.2.1 to 25.0.0. After this the "drawableX" feature in EditText doesn't work.
編輯 01.11:我了解到,如果您使用 android:drawableStart 而不是 android:drawableLeft,則在 xml 中設(shè)置 drawable 有效.但是以編程方式設(shè)置設(shè)置drawables不起作用.我用它來(lái)制作一個(gè)清除"按鈕來(lái)清空 EditText.但是這個(gè)功能現(xiàn)在被打破了.如果這是來(lái)自 Google 的故意或錯(cuò)誤,我將不勝感激任何解決方法或知識(shí)!
EDIT 01.11: I learned that setting drawable in xml works if you use android:drawableStart instead of android:drawableLeft. But setting setting drawables programatically does not work. I use this to make a "Clear"-button to empty the EditText. But this feature is broken now. I would appreciate any work-arounds or knowledge about if this is intentional from Google or a bug!
我的可清除編輯文本代碼以前有效但現(xiàn)在無(wú)效:
My code for Clearable edit-text that worked before but doesn't now:
public class ClearableErrorTextInputEditText extends ErrorTextInputEditText implements View.OnFocusChangeListener, View.OnTouchListener, TextWatcher {
private Drawable resIcon;
private OnFocusChangeListener childFocusListener;
public ClearableErrorTextInputEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setup();
}
public ClearableErrorTextInputEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setup();
}
public ClearableErrorTextInputEditText(Context context) {
super(context);
setup();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (getCompoundDrawables()[2] != null) {
final boolean tappedClose = event.getX() > (getWidth() - getPaddingRight() - resIcon.getIntrinsicWidth());
if (tappedClose) {
setText("");
return false; // true will fail on emulator running 2.1 and physical keyboard / scroll wheel
}
}
}
return false;
}
@Override
public void setOnFocusChangeListener(OnFocusChangeListener l) {
childFocusListener = l;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
setClearIconVisible(hasFocus && getText().length() > 0);
if (childFocusListener!=null){
childFocusListener.onFocusChange(v, hasFocus);
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count){
super.onTextChanged(s, start, before, count);
setClearIconVisible(isFocused() && s.length() > 0);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {} // not interesting
@Override
public void afterTextChanged(Editable s) {} // // not interesting
private void setup() {
if(isInEditMode()){
return;
}
resIcon = getResources().getDrawable(R.drawable.ic_clear, null);
resIcon.setBounds(0, 0, resIcon.getIntrinsicWidth(), resIcon.getIntrinsicHeight());
setClearIconVisible(false);
super.setOnTouchListener(this);
super.setOnFocusChangeListener(this);
addTextChangedListener(this);
}
private void setClearIconVisible(final boolean visible){
final Drawable icon = visible ? resIcon : null;
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1], icon, getCompoundDrawables()[3]);
}
推薦答案
根據(jù) Ahmed Ashraf G 的回答,我找到了解決方案.更改以下代碼:
Based on the answer by Ahmed Ashraf G, I was able to find the solution. Changing the following code:
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1], icon, getCompoundDrawables()[3]);
到:
setCompoundDrawablesRelative(getCompoundDrawablesRelative()[0],
getCompoundDrawablesRelative()[1], icon, getCompoundDrawablesRelative()[3]);
從 StackOverflow 上的其他地方(文檔沒(méi)有提到這一點(diǎn)),xxxCompoundDrawablesXxx 和 xxxCompundDrawablesRelativeXxx 之間的區(qū)別在于相對(duì)版本考慮了 RTL 語(yǔ)言,即它們與使用 drawableStart 而不是 drawableLeft 相同.
From other places on StackOverflow (the documentation does NOT mention this) the difference between xxxCompoundDrawablesXxx and xxxCompundDrawablesRelativeXxx is that the relative versions take into account RTL-languages, ie they are the same as using drawableStart instead of drawableLeft.
因此,總而言之,Google 已經(jīng)破壞了 TextInputLayout 內(nèi) EditText 的所有不是 RTL 方法的方法.由于新方法是在 API 級(jí)別 17 中添加的,我認(rèn)為這是主要錯(cuò)誤,可能會(huì)在未來(lái)的更新中修復(fù)
So in conclusion, Google has broken all methods that are not RTL-methods for EditText inside TextInputLayout. Since the new methods are added in API level 17 I see this as major bug, that will probably be fixed in future updates
這篇關(guān)于無(wú)法在 TextInputLayout 內(nèi)的 EditText 中使用 drawable的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!