2016-08-25 4 views
2

エラーが発生した場合、TextInputLayoutsのフローティングラベルで色を(たとえば赤に)変更します。エラーテキストの色を変更することはできますが、浮動ラベルの外観には影響しません(他のスレッドの主張とは異なります)。エラーのために定義された状態がないように、この問題を解決するためにヒントカラーのセレクタを使用することはできませんでした。誰もが、エラーイベントの変更を手動でプログラムすることなく/(新しいEditTextを親として)新しいJavaクラスを作成することなくこれを行う方法を知っていますか?ここでAndroid:エラー状態のTextInputLayoutのフローティングラベルのヒント(ヒント)を変更しました

は、私が定義されたスタイリングは、以下のとおりです。

<style name="EditTextFloatingLabel" parent="@android:style/TextAppearance"> 
    <item name="android:textSize">@dimen/textsize_caption_small</item> 
    <item name="android:layout_marginBottom">8dp</item> 
    <item name="android:textColor">@color/input_text_color</item> 
</style> 

<style name="EditTextErrorText" parent="@android:style/TextAppearance"> 
    <item name="android:textColor">@color/error_color</item> 
</style> 

<style name="EditTextLayout"> 
    <item name="android:textColorHint">@color/placeholder_color</item> 
    <item name="android:background">@drawable/input_field_background</item> 
    <item name="android:paddingBottom">@dimen/default_margin_bottom</item> 
    <item name="android:paddingStart">@dimen/default_margin_left</item> 
    <item name="android:paddingEnd">@dimen/default_margin_right</item> 
</style> 

<style name="EditTextTheme"> 
    <item name="android:imeOptions">actionDone</item> 
    <item name="android:maxLines">1</item> 
    <item name="colorControlNormal">@color/primary_line_color</item> 
    <item name="colorControlActivated">@color/nordea_blue</item> 
    <item name="android:colorControlHighlight">@color/error_color</item> 
    <item name="android:textColorPrimary">@color/input_field_text</item> 
    <item name="android:textSize">@dimen/textsize_caption</item> 
    <item name="android:textColorHint">@color/placeholder_color</item> 

</style> 

<style name="EditText"> 
    <item name="android:theme">@style/EditTextTheme</item> 
    <item name="android:textCursorDrawable">@drawable/cursor_blue</item> 
    <item name="android:paddingTop">@dimen/default_padding_top</item> 
    <item name="android:paddingStart">@dimen/payment_text_input_padding</item> 
</style> 

使用法:

 <android.support.design.widget.TextInputLayout 
      android:id="@+id/input_field_error_wrapper_light" 
      style="@style/EditTextLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginEnd="@dimen/testlogin_text_input_end_padding" 
      android:layout_marginStart="@dimen/testlogin_text_input_start_padding" 
      android:paddingTop="@dimen/default_padding_top" 
      app:hintTextAppearance="@style/EditTextFloatingLabel" 
      app:errorTextAppearance="@style/EditTextErrorText" 
      app:errorEnabled="true"> 

      <EditText 
       android:id="@+id/input_field_light_error" 
       style="@style/EditText" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="#Input Field Disabled Light" 
       android:imeOptions="actionDone" 
       /> 
     </android.support.design.widget.TextInputLayout> 

そして、これは私が見たものである。

enter image description here

+0

私の更新の回答を試してください –

答えて

3

ある

上で管理しますエラー状態では、カスタムエラー状態を作成するソリューションと、この状態に入ることができるカスタムTextInputLayoutを使用することに決めました。

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    ... 

    <!-- custom states --> 
    <declare-styleable name="ErrorState"> 
     <attr name="state_error" format="boolean" /> 
    </declare-styleable> 
</resources> 

ErrorStateTextInputLayoutクラス:ヒントテキストの色を設定するための

public class ErrorStateTextInputLayout extends TextInputLayout { 
    private boolean hasError = false; 
    private static final int[] ERROR_STATE = new int[]{R.attr.state_error}; 

    public ErrorStateTextInputLayout(Context context) { 
     super(context); 
    } 

    public ErrorStateTextInputLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ErrorStateTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected int[] onCreateDrawableState(int extraSpace) { 
     int[] state = super.onCreateDrawableState(extraSpace + 1); 
     if (hasError) { 
      mergeDrawableStates(state, ERROR_STATE); 
     } 
     return state; 
    } 

    @Override 
    public void setError(@Nullable CharSequence error) { 
     if (error == null) { 
      setHasError(false); 
     } else { 
      setHasError(true); 
     } 
     super.setError(error); 
    } 


    public void setHasError(boolean error) { 
     this.hasError = error; 
     refreshDrawableState(); 
    } 
} 

セレクター:

コード:RES /値/ attrs.xmlの新しいエラー状態を定義

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item android:color="@color/disabled_text_color" android:state_enabled="false" /> 
    <item android:color="@color/error_color" app:state_error="true" /> 
    <item android:color="@color/input_text_color" android:state_focused="true" /> 
    <item android:color="@color/placeholder_color" /> 
</selector> 

このブログの投稿は私をたくさん助けました:http://code.neenbedankt.com/example-of-custom-states-in-android-components/

+0

どうやって作ったのですか? setHasError(true)を呼び出すことは私には当てはまりません。 error_appearanceのセレクタをtextColorとして設定しました。 – NightFury

+0

@ NightFury私はエラーテキストのために単一の色を使用するので、私はセレクタについてはわかりません(私はそれはあまりにもうまくいくはずです)。私の場合は、カスタム状態属性を定義し、適切な場所に状態を設定するだけで、上記のコードスニペットに見られるように、このトリックが行われました。おそらく、コード部分を投稿しても、どこに問題があるのか​​がわかります。 – hildegard

0

this..solid_red浮動色を試してみてください.....

<style name="TextLabelInput" parent="TextAppearance.AppCompat"> 
<!-- Hint color and label color in FALSE state --> 
<item name="android:textColorHint">@color/solid_red</item> 
<item name="android:textSize">16sp</item> 
<item name="android:textStyle">bold</item> 
<item name="android:textColor">@color/solid_red</item> 
<item name="android:duration">200</item> 
<item name="android:textColorHighlight">@color/solid_red</item> 

<!-- Label color in TRUE state and bar color FALSE and TRUE State --> 
<item name="colorAccent">@color/solid_red</item> 
<item name="colorControlNormal">@color/solid_red</item> 
<item name="colorControlActivated">@color/solid_red</item> 
<item name="colorPrimary">@color/solid_red</item> 
<item name="colorPrimaryDark">@color/solid_red</item> 

<android.support.design.widget.TextInputLayout 
     android:id="@+id/input_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     app:errorTextAppearance="@style/TextLabelInput" 

     > 

ヒントテキストの色、あなたのメインテーマ私もレイアウトだったときに、いくつかの他のアクションを実行するために必要に応じてcolorPrimaryとcolorAccent

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 

</style> 
+0

これは私のためには機能しませんでした。アンダーラインとエラーメッセージは赤ですが、浮動テキストは引き続きアクセントカラーです。 – Laranjeiro