2016-11-20 20 views
0

TextInputLayoutエラーメッセージを強制的に1行にする方法はありますか?TextInputLayoutエラーメッセージのサイズ

私は含むerror_appearanceスタイルでTextInputLayoutにapp:errorTextAppearance="@style/error_appearance"を配置しようとした:

<item name="android:maxLines">1</item> 
<item name="android:ellipsize">end</item> 
<item name="android:inputType">text</item> 

をし、それが動作しません。ただし、色を変更すると動作します。私はそれを取得しない、mErrorViewは単なるTextViewである、それは動作するはずです。

TextInputLayout error message

+0

はXMLに追加idでエラーのTextViewを取得することができ、このライン アンドロイド:単一行= "true" を –

+0

@MalikAbuQaoudはすでにそれを試み、それが動作しません。 singleLineは廃止されました – andrei

+0

singleLIneはまだ動作していますが、それは私と一緒に動作します。楕円をマーキーに変更しようとしました –

答えて

1

それはエラーテキストがちょうどTextViewですが、TextAppearanceスタイルは唯一のテキスト自体に影響を与え、ないTextViewは(離れてそれらの属性に配慮しサイジングから)それをレイアウトする方法を本当です。 errorTextAppearanceでエラーテキストのサイズ、書体、色などを設定することはできますが、にはellipsizeまたはmaxLinesを設定することはできません。

エラーはちょうどTextViewなので、私たちは自分自身で必要な属性を設定することができます。 TextInputLayoutの子孫のすべてViewを繰り返し処理することができますが、TextInputLayoutEditTextではないTextViewを保持できるため、扱いにくく、信頼性が低くなります。私は通常、このようなことの反映を好む。 setErrorEnabled()メソッドがtrueで呼び出されたとき

エラーTextViewが作成され、メソッドがfalseで呼び出された場合、そのフィールドは無効になります。これを外部的に追跡するのではなく、TextInputLayoutをサブクラス化し、エラーが発生するとエラーTextViewに目的の属性を設定する方が簡単です。インスタンス化中にsetErrorEnabled()が自動的に呼び出されるので、これを有効にするためにメソッドを明示的に呼び出す必要はありません。例えば

public class CustomTextInputLayout extends TextInputLayout { 

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

    @Override 
    public void setErrorEnabled(boolean enabled) { 
     super.setErrorEnabled(enabled); 

     if (!enabled) { 
      return; 
     } 

     try { 
      Field errorViewField = TextInputLayout.class.getDeclaredField("mErrorView"); 
      errorViewField.setAccessible(true); 
      TextView errorView = (TextView) errorViewField.get(this); 
      if (errorView != null) { 
       errorView.setMaxLines(1); 
       errorView.setEllipsize(TextUtils.TruncateAt.END); 
      } 
     } 
     catch (Exception e) { 
      // At least log what went wrong 
      e.printStackTrace(); 
     } 
    } 
} 

これはTextInputLayoutのドロップイン置換され、そしてあなただけ通常のクラスと同じように、あなたのレイアウトでそれを使用することができます。完全期すため

<com.mycompany.myapp.CustomTextInputLayout 
    android:id="@+id/til" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <android.support.design.widget.TextInputEditText 
     android:id="@+id/edit_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</com.mycompany.myapp.CustomTextInputLayout> 

screenshot


、私はTextInputLayoutの最初TextView子を見つけるために、上記の方法の代わりに使用することができ、次のものがあります必要な属性を設定します。基本的なデフォルトのTextInputLayoutでは、エラーTextViewが最初に見つかったはずです。チェックを追加したい場合は、見つかった子のテキストとTextInputLayoutのエラーとして設定した子を比較することができます。

// Returns true if found 
private static boolean findErrorView(ViewGroup vg) { 
    final int count = vg.getChildCount(); 
    for (int i = 0; i < count; ++i) { 
     final View child = vg.getChildAt(i); 
     if(child instanceof ViewGroup) { 
      if(findErrorView((ViewGroup) child)) { 
       return true; 
      } 
     } 
     else if (child.getClass().equals(TextView.class)) { 
      setAttributes((TextView) child); 
      return true; 
     } 
    } 
    return false; 
} 

private static void setAttributes(TextView t) { 
    t.setMaxLines(1); 
    t.setEllipsize(TextUtils.TruncateAt.END); 
} 

TextInputLayoutViewGroupなので、あなただけのサブクラス内、または外部のいずれか、そのインスタンスに直接findErrorView()を呼び出すことができます。ただし、エラーTextViewは、エラーが有効になるたびに新たに作成され、無効にされると破棄されます。これらの設定はそれを介して持続されません。

+1

おい、あなたは天才です..魅力のように働いた..おかげでトンの男。 – Rachit

0

あなたは

TextView errorView = textInputLayout.findViewById(R.id.textinput_error); 
errorView.setMaxLines(1); 
errorView.setSingleLine(true); 
関連する問題