TextInput layout turns editext into red on setting

2019-06-28 03:48发布

问题:

I have a layout, whenever i press submit button and set error on text input layout it turns the editText into red but i hadn't set any color on editText on set error. Basically i just wanted to give the error string below the editText and not to turn editText into red on setting the error. My Fragment code is as follows,

public class SignIn extends Fragment implements View.OnClickListener
{
TextInputLayout edEamil,edPassword;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    // LogUtil.e(TAG,"onCreateView");
    return inflater.inflate(R.layout.fragment_signin,container,false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // LogUtil.e(TAG,"onViewCreated");
    Button btSignin= GeneralFunction.findViewByIdAndCast(view, R.id.fs_bt_submit);
    btSignin.setOnClickListener(this);
    btSignin.setText(GeneralFunction.covertFistChat_everyWordUpper(getString(R.string.first_signin)));

    TextView tvForgetPassword= GeneralFunction.findViewByIdAndCast(view, R.id.fs_tv_fPassword);
    tvForgetPassword.setOnClickListener(this);

    TextView tvSignUP= GeneralFunction.findViewByIdAndCast(view, R.id.fs_tv_fSignup);
    tvSignUP.setOnClickListener(this);
    tvSignUP.setText(GeneralFunction.covertFistChat_everyWordUpper(getString(R.string.first_signUP)));

    edEamil=GeneralFunction.findViewByIdAndCast(view,R.id.fs_ti_email);
    DrawableState.editextSelector(edEamil);

    edPassword=GeneralFunction.findViewByIdAndCast(view,R.id.fs_ti_password);
    DrawableState.editextSelector(edPassword);
}

@Override
public void onClick(View v) {
    switch (v.getId())
    {
        case R.id.fs_bt_submit:
        {
            edEamil.setError("Not a valid email address!");
            edPassword.setError("Not a valid password!");
        }break;
    }
 }
}

My xml code for fragment is as follows with linear layout as parent,

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.TextInputLayout
    android:id="@+id/fs_ti_email"
    style="@style/textInputLayout">

    <EditText
        style="@style/edittext"
        android:tag="@string/str_email"
        android:hint="@string/str_email"/>
</android.support.design.widget.TextInputLayout>

<android.support.v4.widget.Space
    android:layout_width="match_parent"
    android:layout_height="@dimen/dim_edMarginTop"/>

<android.support.design.widget.TextInputLayout
    android:id="@+id/fs_ti_password"
    style="@style/textInputLayout">

    <EditText
        style="@style/edittext"
        android:imeOptions="actionDone"
        android:inputType="textPassword"
        android:tag="@string/str_password"
        android:hint="@string/str_password"/>
</android.support.design.widget.TextInputLayout>

<android.support.v4.widget.Space
    android:layout_width="match_parent"
    android:layout_height="@dimen/dim_edMarginButtonView"/>

<android.support.v7.widget.AppCompatButton style="@style/button"
    android:id="@+id/fs_bt_submit"
    android:text="@string/first_signin"/>

<android.support.v4.widget.Space
    android:layout_width="match_parent"
    android:layout_height="@dimen/dim_edPaddingLeftRigh"/>

<RelativeLayout android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView style="@style/textView"
        android:id="@+id/fs_tv_fPassword"
        android:text="@string/str_forgetPassword"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"/>
    <TextView style="@style/textView"
        android:id="@+id/fs_tv_fSignup"
        android:text="@string/first_signUP"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"/>
</RelativeLayout>

and the style for editext and input layout is as follows,

 <style name="textInputLayout">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:paddingBottom">@dimen/dim_textLaoutMargin</item>
    <item name="android:layout_marginBottom">@dimen/dim_textLaoutMargin</item>
</style>

<style name="edittext" parent="android:Widget.EditText">
    <item name="android:singleLine">true</item>
    <item name="android:textSize">@dimen/dim_widgetMarginLeft</item>
    <item name="android:textColor">@color/colorWhite</item>
    <item name="android:paddingLeft">@dimen/dim_edPaddingLeftRigh</item>
    <item name="android:paddingRight">@dimen/dim_edPaddingLeftRigh</item>
    <item name="android:paddingTop">@dimen/dim_edPaddingTop</item>
    <item name="android:paddingBottom">@dimen/dim_edPaddingBottom</item>
    <item name="android:gravity">start</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:textColorHint">@color/colorWhite</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">@dimen/dim_buttonHeight</item>
    <item name="android:inputType">text|textCapSentences|textNoSuggestions</item>
    <item name="android:privateImeOptions">nm</item>
    <item name="android:imeOptions">actionNext</item>

    <item name="colorControlNormal">@color/colorWhite</item>
    <item name="colorControlActivated">@color/colorPrimary</item>
    <item name="android:textColorPrimary">@color/colorPrimary</item>
</style>

basically i just wanted to give the error string below the editext and not to turn editext into red on setting the error.

My ui after setting the error is,

My normal ui ,

回答1:

You have to setError() not to TextInputLayout but to EditText inside TextInputLayout.

XML : here I assigned id for EditText inside TextInputLayout;

<android.support.design.widget.TextInputLayout
    style="@style/textInputLayout"
    android:id="@+id/fs_ti_email">

    <EditText

        android:id="@+id/edit_text_email" <!-- here your id-->
        style="@style/edittext"
        android:tag="@string/str_email"
        android:hint="@string/str_email"/>
</android.support.design.widget.TextInputLayout>

Java: here I find EditText by ID and assign setError() to it.

    EditText email;

        //your code here...
        ...
  @Override
  public void onClick(View v) {
    switch (v.getId())
    {
        case R.id.fs_bt_submit:
        {
            email.setError("Not a valid email address!");
        }break;
    }
  }