TextInputLayout禁用动画

时间:2015-06-08 14:48:15

标签: android

我正在使用TextInputLayout来实现浮动标签模式。但是,当我在EditText上以编程方式设置文本时,我仍然得到标签的动画从控件移动到标签 - 就像用户单击它一样。

我不想要这个动画但是如果我以编程方式设置它,这可能吗?这是我的代码:

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

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText1" />

</android.support.design.widget.TextInputLayout>

在onResume中我做:

    TextInputLayout root = (TextInputLayout)findViewById(R.id.root);
    EditText et = (EditText)root.findViewById(R.id.editText1);
    et.setText("Actual text");
    root.setHint("Hint");

7 个答案:

答案 0 :(得分:38)

从支持库的第23行开始,setHintAnimationEnabled method has been added。这是the docs。因此,您可以在XML中将this new attribute设置为false,然后在完成填充editText后以编程方式将其设置为true。或者根据需要以编程方式处理它。

所以在你的例子中,这将变成类似:

TextInputLayout root = (TextInputLayout)findViewById(R.id.root);
root.setHintAnimationEnabled(false);
root.setHint("Hint");

EditText et = (EditText)root.findViewById(R.id.editText1);
et.setText("Actual text");

// later...
root.setHintAnimationEnabled(true);

当然,请务必打开Android SDK Manager并将 Android支持库更新为rev。 23和 Android支持存储库转。首先是17,然后通过以下方法将其添加到build.gradle:

compile 'com.android.support:design:23.0.0'
  

请注意,由于Design库依赖于Support v4和AppCompat支持库,因此在添加Design库依赖项时将自动包含这些库。

答案 1 :(得分:5)

我找到了一种(笨重的)方法。查看TextInputLayout的源代码,我发现只有在课程没有更新动画提示的情况下才会添加EditText它。唯一的障碍是你只能将它添加到布局一次,一旦它在那里,它将永久地绑在它上面,并且没有办法将它删除。

所以这是解决方案:

  1. 创建TextInputLayout 而不使用EditText 。以编程方式或通过XML通胀 - 并不重要,但必须是空的。
  2. 创建EditText并将其文本设置为您需要的任何内容。
  3. EditText添加到TextInputLayout
  4. 以下是一个例子:

    TextInputLayout hintView = (TextInputLayout) findViewById(R.id.hint_view);
    hintView.setHint(R.string.hint);
    
    EditText fieldView = new EditText(hintView.getContext());
    fieldView.setText(value);
    
    hintView.addView(fieldView);
    

    不幸的是,如果你想在没有动画的情况下将文本设置为其他内容,除了创建新的EditText(最后一个可以重复使用)之外,你将不得不重复所有这些步骤。我希望谷歌可以解决这个问题,因为它真的很不方便,但是现在我们拥有它。

    更新:幸运的是,这已在设计库23.0.0中修复,因此只需更新到该版本,您就不必做所有这些疯狂的事情。

答案 2 :(得分:3)

我将为您提供简单的代码,您不必以编程方式只添加xlm属性,这就是全部。

<android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:hintAnimationEnabled="true"
                app:passwordToggleEnabled="true">

                <EditText
                    android:id="@+id/password_field_activity_login"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@android:color/transparent"
                    android:hint="@string/password"
                    android:inputType="textPassword"
                    android:padding="10dp"
                    android:textColor="@color/color_holo_light_gray"
                    android:textColorHint="@color/color_holo_light_gray"
                    android:textCursorDrawable="@drawable/cursor_drawable" />

</android.support.design.widget.TextInputLayout>

希望它会有所帮助

答案 3 :(得分:3)

您可以通过使用

禁用它
app:hintAnimationEnabled="false"

答案 4 :(得分:1)

Put this attribute app:hintEnabled="false" here:

 <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:hintEnabled="false">

对我有用

答案 5 :(得分:0)

我查看了有关支持库v23的想法 - 它还没有工作:(如果你想使用数据绑定labrary,编程插入EditText是不可用的

在研究结果中,我找到了没有完全禁用动画的解决方案:

layout.xml

<android.support.design.widget.TextInputLayout
     android:id="@+id/text_til"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:hint="@string/product_title_placeholder">
     <android.support.design.widget.TextInputEditText
          android:id="@+id/text_tiet"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="@={bindingText}"/>
 </android.support.design.widget.TextInputLayout>

Activity.java

final TextInputLayout textLayout = (TextInputLayout) findViewById(R.id.text_til);
if(binding.getText() != null) {
   // disable animation
   textLayout.setHintAnimationEnabled(false);
   final TextInputEditText editText = (TextInputEditText) titleLayout.findViewById(R.id.text_tiet);
   editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View view, boolean b) {
           // enable animation after layout inflated
           textLayout.setHintAnimationEnabled(true);
           editText.setOnFocusChangeListener(null);
       }
   });
}
// manage focus for new binding object
((View)textLayout .getParent()).setFocusableInTouchMode(binding.getText() == null);

它看起来并不漂亮,但它有效:)

答案 6 :(得分:0)

我在加载视图层次结构后编写了一个小方法,该视图层次结构在初始显示时禁用动画,但在病房之后启用它。将其添加到您的基础活动/片段/视图中,它将解决它的问题。

private void setTextInputLayoutAnimation(View view) {
        if (view instanceof TextInputLayout) {
            TextInputLayout til = (TextInputLayout) view;
            til.setHintAnimationEnabled(false);
            til.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                @Override public boolean onPreDraw() {
                    til.getViewTreeObserver().removeOnPreDrawListener(this);
                    til.setHintAnimationEnabled(true);
                    return false;
                }
            });
            return;
        }

        if (view instanceof ViewGroup) {
            ViewGroup group = (ViewGroup) view;
            for (int i = 0; i < group.getChildCount(); i++) {
                View child = group.getChildAt(i);
                setTextInputLayoutAnimation(child);
            }
        }
    }