2015-12-09 73 views
8

在我第一次使用新的Android的小部件TextInputLayout,這是很不錯,但我使用SETERROR方法安卓TextInputLayout改變的EditText樣式設置錯誤後爲空

這是我的XML

面臨的一些問題
<android.support.design.widget.TextInputLayout 
    android:id="@+id/userData_txtNameWrapper" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:textColorHint="@color/light_gray" 
    app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"> 
    <EditText 
     android:id="@+id/userData_txtName" 
     style="@style/bold_textbox_style" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/textinut_height" 
     android:layout_margin="5dp" 
     android:hint="name" 
     android:imeOptions="actionNext" 
     android:inputType="text" 
     android:paddingTop="10dp" 
     android:textSize="@dimen/medium_text"/> 
</android.support.design.widget.TextInputLayout> 

發生了什麼:

當我運行

setError("error message") 

整個EditText背景和提示文字顏色變成紅色,因爲這裏沒問題。問題是我運行時

setError(null) 

EditText的樣式完全改變了原來的樣式。

啓動狀態:

聚焦 unfocused 集中 focused

setError("mandatory field")

enter image description here

setError(null)

enter image description here

我做了很多的研究,但找不到任何有用的,應該問題是什麼?地獄

UPDATE

setError()方法的Android源代碼調查我發現這個

public void setError(@Nullable CharSequence error) { 
    if (!mErrorEnabled) { 
     if (TextUtils.isEmpty(error)) { 
      // If error isn't enabled, and the error is empty, just return 
      return; 
     } 
     // Else, we'll assume that they want to enable the error functionality 
     setErrorEnabled(true); 
    } 
    if (!TextUtils.isEmpty(error)) { 
     ViewCompat.setAlpha(mErrorView, 0f); 
     mErrorView.setText(error); 
     ViewCompat.animate(mErrorView) 
       .alpha(1f) 
       .setDuration(ANIMATION_DURATION) 
       .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) 
       .setListener(new ViewPropertyAnimatorListenerAdapter() { 
        @Override 
        public void onAnimationStart(View view) { 
         view.setVisibility(VISIBLE); 
        } 
       }) 
       .start(); 
     // Set the EditText's background tint to the error color 
     mErrorShown = true; 
     updateEditTextBackground(); 
     updateLabelVisibility(true); 
    } else { 
     if (mErrorView.getVisibility() == VISIBLE) { 
      ViewCompat.animate(mErrorView) 
        .alpha(0f) 
        .setDuration(ANIMATION_DURATION) 
        .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) 
        .setListener(new ViewPropertyAnimatorListenerAdapter() { 
         @Override 
         public void onAnimationEnd(View view) { 
          view.setVisibility(INVISIBLE); 
          updateLabelVisibility(true); 
         } 
        }).start(); 
      // Restore the 'original' tint, using colorControlNormal and colorControlActivated 
      mErrorShown = false; 
      updateEditTextBackground(); 
     } 
    } 


    private void updateEditTextBackground() { 
     if (mErrorShown && mErrorView != null) { 
      // Set the EditText's background tint to the error color 
      ViewCompat.setBackgroundTintList(mEditText, 
        ColorStateList.valueOf(mErrorView.getCurrentTextColor())); 
     } else if (mCounterOverflowed && mCounterView != null) { 
      ViewCompat.setBackgroundTintList(mEditText, 
        ColorStateList.valueOf(mCounterView.getCurrentTextColor())); 
     } else { 
      final TintManager tintManager = TintManager.get(getContext()); 
      ViewCompat.setBackgroundTintList(mEditText, 
        tintManager.getTintList(R.drawable.abc_edit_text_material)); 
     } 
    } 

和調試我發現一段代碼在updateEditTextBackground()獲取執行代碼以下

final TintManager tintManager = TintManager.get(getContext()); 
ViewCompat.setBackgroundTintList(mEditText, 
     tintManager.getTintList(R.drawable.abc_edit_text_material)); 

它看起來Android是任意replaci ng EditText的背景色調。我嘗試在名爲abc_edit_text_material的可繪製文件夾中創建一個文件。XML與此代碼

<inset xmlns:android="http://schemas.android.com/apk/res/android" 
     android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material" 
     android:insetRight="@dimen/abc_edit_text_inset_horizontal_material" 
     android:insetTop="@dimen/abc_edit_text_inset_top_material" 
     android:insetBottom="@dimen/abc_edit_text_inset_bottom_material"> 

    <selector> 
     <item android:state_enabled="false" android:drawable="@color/white"/> 
     <item android:state_pressed="false" android:state_focused="false" android:drawable="@color/white"/> 
     <item android:drawable="@color/white"/> 
    </selector> 

</inset> 

但這是結果後setError(null)

enter image description here

而且我注意到問題的存在,只有當我運行SETERROR(「錯誤信息」),然後SETERROR(空)

UPDATE 2 這是我使用來驗證我的輸入的代碼

public boolean validateInputs() { 
    mTxtNameWrapper.setError(null); 
    mTxtLastNameWrapper.setError(null); 
    mTxtEmailWrapper.setError(null); 
    mTxtCountryWrapper.setError(null); 
    mTxtIdCardWrapper.setError(null); 
    mTxtFiscalCodeWrapper.setError(null); 
    mLblDocTypeError.setVisibility(View.GONE); 
    if (Strings.isNullOrEmpty(mTxtName.getText().toString())) { 
     mTxtNameWrapper.setError("Mandatory field"); 
     return false; 
    } 
    if (Strings.isNullOrEmpty(mTxtLastName.getText().toString())) { 
     mTxtLastNameWrapper.setError("Mandatory field"); 
     return false; 
    } 
    if (Strings.isNullOrEmpty(mTxtEmail.getText().toString())) { 
     mTxtEmailWrapper.setError("Mandatory field"); 
     return false; 
    } 
    if (!android.util.Patterns.EMAIL_ADDRESS.matcher(mTxtEmail.getText().toString()).matches()) { 
     mTxtEmailWrapper.setError("Invalid email format"); 
     return false; 
    } 
    if (Strings.isNullOrEmpty(mTxtCountry.getText().toString())) { 
     mTxtCountryWrapper.setError("Mandatory field"); 
     return false; 
    } 
    if (mRdgIdType.getCheckedRadioButtonId() == -1) { 
     mLblDocTypeError.setText("Select a document type"); 
     mLblDocTypeError.setVisibility(View.VISIBLE); 
     return false; 
    } 
    if (Strings.isNullOrEmpty(mTxtIdCard.getText().toString())) { 
     mTxtIdCardWrapper.setError("Mandatory field"); 
     return false; 
    } 
    if (Strings.isNullOrEmpty(mTxtFiscalCode.getText().toString())) { 
     mTxtFiscalCodeWrapper.setError("Mandatory field"); 
     return false; 
    } 
    return true; 
} 

我要瘋了!

+0

setError(null)=> clearError()? –

+0

你確定這種方法存在嗎? – Apperside

+0

setErrorEnabled(false)? –

回答

0

設置

<style name="TextAppearence.App.TextInputLayout" parent="@android:style/TextAppearance"> 
     <item name="android:textColor">@color/colorPrimaryDark</item> 
     <item name="android:textColorHint">@color/colorPrimaryDark</item> 
     <item name="android:textSize">14sp</item> 
     <item name="colorAccent">@color/colorPrimaryDark</item> 
     <item name="colorControlNormal">@color/colorPrimaryDark</item> 
     <item name="colorControlActivated">@color/colorPrimaryDark</item> 
    </style> 

把下面的代碼你的TextInput的風格,你SETERROR(空)

 txt.setError(null); 

//for plain white backgorund 
    editText.setBackgroundColor(getResources().getColor(android.R.color.white)); 

//or if you want any other than 
editText.setBackgroundResource(R.drawable.border); 

其中邊框是我的XML

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listview_background_shape"> 
    <stroke android:width="2dp" android:color="#ff207d94" /> 
    <padding android:left="2dp" 
     android:top="2dp" 
     android:right="2dp" 
     android:bottom="2dp" /> 
    <corners android:radius="5dp" /> 
    <solid android:color="#ffffffff" /> 
</shape> 
+0

已經有一個類似的風格與textColor,textColorHint和textSIze,分別添加colorAccent,colorControlNormal和colorControlActivated與藍色,紅色和黃色,但沒有任何變化。 – Apperside

+0

確定....你可以請發佈您的編輯文本樣式 –

+0

Apperside

4

你只需要改變在將錯誤設置爲空之後,顏色可以回到任何你想要的。喜歡的東西:

yourEditText.setError(null); 
yourEditText.getBackground().mutate().setColorFilter(
      ContextCompat.getColor(getContext() , R.color.somecolor), 
      PorterDuff.Mode.SRC_ATOP); 
4

這是一個錯誤support:design:23.2.0(也可能是舊版本)據報道,作爲一個問題here ,並已固定在23.3.0update

+0

錯誤鏈接被破壞.. – Ajinkya

+0

@Aji恩佳對不起,只是修復了鏈接 – kingdonnaz

+0

確認它是固定的.. – Ajinkya

5

我遇到了類似的問題,發現簡單的解決方案。如果我們在TextInputLayout內設置了EditText的自定義背景drawable/color,就會出現此問題。解決方案是爲TextInputLayout創建子類並覆蓋setError()drawableStateChanged()方法,並將我們的自定義繪圖/顏色再次設置爲EditText's背景。例如,我爲我的EditText's背景圓角繪製一套,下面是我的子類,

public class RoundedBorderedTextInputLayout extends TextInputLayout { 
    private Context context; 

    public RoundedBorderedTextInputLayout(Context context) { 
     super(context); 
     this.context = context; 
    } 

    public RoundedBorderedTextInputLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context = context; 
    } 

    public RoundedBorderedTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     this.context = context; 
    } 

    @Override 
    protected void drawableStateChanged() { 
     super.drawableStateChanged(); 

     EditText editText = getEditText(); 
     if(editText != null) { 
      editText.setBackground(ContextCompat.getDrawable(this.context, R.drawable.custom_rounded_edittext)); 
     } 
    } 

    @Override 
    public void setError(@Nullable final CharSequence error) { 
     super.setError(error); 

     EditText editText = getEditText(); 
     if(editText != null) { 
      editText.setBackground(ContextCompat.getDrawable(this.context, R.drawable.custom_rounded_edittext)); 
     } 
    } 
} 

然後用你的自定義類的XML,

<com.example.RoundedBorderedTextInputLayout 
       android:id="@+id/text_input_layout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 

       <EditText 
        android:id="@+id/edittext" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:inputType="textPassword"/> 

    </com.example.RoundedBorderedTextInputLayout> 

希望這有助於。快樂的Android編碼:)

+1

固定的唯一幫助我結合這個anser和設置背景像這樣:yourEditText.getBackground()。mutate()。setColorFilter( ContextCompat.getColor(getContext(),R.color.somecolor), PorterDuff.Mode.SRC_ATOP); – shtolik

+0

救了我的一天... –

0

我有一個絕招來解決這個問題簡單:

1,新的一類擴展android.support.design.widget.TextInputEditText; 2,覆蓋getBackground()方法,使其返回null;

由於方法updateEditTextBackground()在TextInputLayout中將判斷editText的背景drawable是否爲null,現在總是返回null,結果是editText的背景不會被錯誤文本顏色改變。