我正在使用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");
答案 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
它。唯一的障碍是你只能将它添加到布局一次,一旦它在那里,它将永久地绑在它上面,并且没有办法将它删除。
所以这是解决方案:
TextInputLayout
而不使用EditText
。以编程方式或通过XML通胀 - 并不重要,但必须是空的。EditText
并将其文本设置为您需要的任何内容。EditText
添加到TextInputLayout
。以下是一个例子:
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是不可用的
在研究结果中,我找到了没有完全禁用动画的解决方案:
<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>
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);
}
}
}