【问题标题】:TextInput layout turns editext into red on setting errorTextInputlayout 在设置错误时将edittext变成红色
【发布时间】:2016-09-25 08:27:13
【问题描述】:

我有一个布局,每当我按下提交按钮并在文本输入布局上设置错误时,它会将 editText 变为红色,但我没有在设置错误时在 editText 上设置任何颜色。 基本上我只是想在editText下面给出错误字符串,而不是在设置错误时将editText变成红色。 我的 Fragment 代码如下,

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;
    }
 }
}

我的片段xml代码如下,以线性布局为父,

<?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>

editext和input布局的样式如下,

 <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>

基本上我只是想在editext下面给出错误字符串,而不是在设置错误时将editext变成红色。

设置错误后我的用户界面是,

我的正常用户界面,

【问题讨论】:

  • 从 EditText 样式中移除背景
  • 从 EditText 中移除 android:background="@drawable/input_border"。这将解决您的问题。如果您想为 EditText 设置背景,请将 background 属性添加到 TextInputLayout

标签: android android-layout android-edittext android-appcompat android-textinputlayout


【解决方案1】:

你必须 setError() 不是 TextInputLayout 而是 TextInputLayout 里面的 EditText。

XML:这里我为 TextInputLayout 中的 EditText 分配了 id;

<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:在这里我通过 ID 找到 EditText 并将 setError() 分配给它。

    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;
    }
  }

【讨论】:

  • 我不想使用editext的设置错误方法。
  • 是什么原因?对我来说,将错误设置为 EditText 对您来说应该不是问题。
  • 正如您所评论的,如果您只想更改 EditText 下方文本的颜色,您应该 setError() 为 EditText。
  • 它会导致一个问题,当您滚动视图时,设置错误方法不会在离开视图时隐藏......我已经在这方面做了很多工作...... .所以我不想在editext set错误上浪费更多时间。
猜你喜欢
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2015-08-29
  • 1970-01-01
相关资源
最近更新 更多