由于用户输入文本而隐藏提示时,包装EditText(或后代)以显示浮动标签的布局。
使用TextInputEditText时,错误图标会覆盖结束图标
我正在开发一个包含 TextInputLayout 组件的界面。 这是我的布局代码: 我正在开发一个包含 TextInputLayout 组件的界面。 这是我的布局代码: <com.google.android.material.textfield.TextInputLayout style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox" android:id="@+id/username_label" android:layout_width="match_parent" android:layout_height="wrap_content" app:startIconDrawable="@drawable/icons8_user_24" app:endIconMode="custom" app:endIconDrawable="@drawable/icons8_user_24" app:errorEnabled="true" android:hint="Enter UserName" android:textColorHint="@color/teal_200"> <com.google.android.material.textfield.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/edit_text" android:inputType="text" /> </com.google.android.material.textfield.TextInputLayout> 这是java代码: UsereditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s != null && !isEmailAddress(s.toString())) { UsereditText.setError("Error Address"); } else { UsereditText.setError(null); } } @Override public void afterTextChanged(Editable s) { } }); 结果图像是: 不过我看到有人做得很完美,不知道怎么做的。 我现在很情绪化,请帮忙! 谢谢。 更新答案(添加更多信息后) 尝试在 TextInputLayout 而不是 TextInputEditText 上调用 setError()。然后,视图本身将确保错误图标不会与结束图标重叠。 不要将编辑图标放置为背景可绘制对象,尝试将其放置为drawableEnd: <com.google.android.material.textfield.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableEnd="@drawable/edit_text" android:inputType="text" /> 更新答案 实际上,我正在遵循下面的 XML 代码 <com.google.android.material.textfield.TextInputLayout android:id="@+id/enter_mail_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/dimen_20dp" android:layout_marginEnd="@dimen/dimen_20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/mail" style="@style/TextViewStyleRegular" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:hint="@string/enter_mail_2" android:inputType="textEmailAddress|textNoSuggestions" android:maxLength="50" /> </com.google.android.material.textfield.TextInputLayout> Kotlin 代码 binding.enterMailText.setErrorIconDrawable(R.drawable.no_icon) binding.enterMailText.error = "Please enter valid email address" no_icon.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> </selector> 这对我有用: 绑定.yourInputLayout.errorIconDrawable = null
如何在TextInputLayout上显示成功状态(类似setError())
我需要在Material的TextInputLayout上显示成功状态。我只需要与设置错误时显示的布局相同的 UI。以下是我需要的: 类自定义文本输入布局( 上下文:
Android 自定义 TextInput 布局,提示文本和占位符重叠
我在使用自定义 TextInputLayout 时遇到一个奇怪的问题,其中我同时具有提示文本和占位符文本,一般情况下,当焦点位于编辑文本上时,提示文本会向上浮动并
EditText TextInputLayout 提示文本对齐:有没有办法像 EditText 视图的 textAlignment 属性一样对齐提示文本
我有一个固定高度的输入文本字段(TextInputLayout 的 EditText)。 我想将提示文本与视图的左上角对齐。 问题:提示文本总是显示在 center_verticle 但我想dis...
更改TextInputLayout的下划线颜色和浮动提示颜色
我在 TextInputLayout 主题中使用上述属性,使 TextInputLayout 激活时的下划线颜色为绿色。 #27e905...
如何更改textinputlayout内textinputedittext中的光标颜色
如何更改textinputedittext的光标颜色。 我使用了 textcursordrawable 但它不起作用。 预先感谢
jetpack compose 中带有提示文本的 TextField
我想在 jetpackcompose 中创建带有提示文本的文本字段。任何如何使用 jectpack 创建文本字段的示例?谢谢
我在 TextInputLayout 中使用 ExitText 并启用 `` 应用程序:passwordToggleEnabled =“true” 并切换视图如下 我想删除切换按钮的右侧填充,但不知何故无法...
Android TextInputLayout endIconDrawable 显示为灰色而不是图像
TextInputLayout endIconDrawable 显示为灰色而不是所需的图像。 只有该图像呈现为灰色。我尝试将图像作为 png 并导入 svg 作为矢量资源。 两者都不起作用
Android Material 文本输入布局结束图标不显示
我正在尝试向我的文本输入布局添加一个可绘制的结束图标。我已经遇到了这样做的方法,但是当我尝试实现它时,它不起作用。 Material io 说这一切都需要
如何在TextInputLayout错误消息中显示可点击的链接,android中的app:setError
我有一个文本输入字段,将名称作为输入。该布局在 TextInputLayout 内包含一个 EditText 小部件。当用户输入为空时,我想显示错误验证消息...
TextInputEditText 当以编程方式设置字段值时,提示保留在后台
我确定用户的位置并将其显示在 TextInputEditText 字段中。然而,这一提示仍然存在于背景中。我究竟做错了什么? 我确定用户的位置并将其显示在 TextInputEditText 字段中。然而,这一提示仍然存在于背景中。我做错了什么? <com.google.android.material.textfield.TextInputLayout android:id="@+id/textLayoutAutocomplete" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/standort" android:layout_weight="1"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/autocomplete" android:focusableInTouchMode="false" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" /> </com.google.android.material.textfield.TextInputLayout> 设置值:: binding.autocomplete.setText(place.toString()) //Also not working: //binding.textLayoutAutocomplete.hint = "" 设置文字后,可以将isHintEnabled的TextInputLayout设置为false。 binding.textLayoutAutocomplete.isHintEnabled = false
如何正确从Material Design TextInputLayout获取文本?
我想使用自定义结束图标从材料设计的 TextInputLayout 中获取文本。 我尝试这样做: TextInputLayout textInputCustomEndIcon = findViewById(R.id.editText); 最终的 TextInputEdi...
Jetpack Compose 如何去除 EditText/TextField 下划线并保留光标?
嗨,我需要删除文本字段中的下划线,因为当文本字段是圆形时它看起来很丑。我已将 activeColor 设置为透明,但光标不会显示(因为它是透明的...
如何防止键盘打开时MaterialAlertDialogBuilder高度自动调整大小?
我使用 MaterialAlertDialogBuilder 构建了一个自定义对话框。该对话框有 2 个 TextInputLayout。问题是当我尝试在 TextInputEditText 中写一些东西并且键盘可见时......
如何更改可设置为显示在 TextInputLayout 中文本字段下方的错误消息的颜色(通过 setError(...) – 请参阅此处的错误状态)? 它通常显示为红色,w...
高度为wrap_content的多行TextInputEditText不恢复大小
如果 xml 中有以下布局。这是更大布局的一部分 如果 xml 中有以下布局。这是更大布局的一部分 <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/layoutInputNewText" android:layout_width="match_parent" android:layout_height="0dp" android:minHeight="52dp" android:layout_marginTop="5dp" android:background="@color/white" android:visibility="visible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> <com.google.android.material.textfield.TextInputLayout android:id="@+id/inputMessage" style="@style/TextInputLayout" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="0dp" android:layout_marginTop="0dp" android:layout_marginEnd="4dp" android:hint="@string/write_a_message" android:labelFor="@id/editMessage" android:textColorHint="@color/chip_text" app:layout_constraintEnd_toStartOf="@id/buttonSend" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:startIconTint="@color/default_green"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/editMessage" android:layout_width="match_parent" android:maxHeight="150dp" android:layout_height="wrap_content" android:layout_marginEnd="4dp" android:focusable="true" android:focusableInTouchMode="true" android:inputType="textMultiLine" android:maxLines="3" android:paddingStart="20dp" android:paddingTop="15dp" android:paddingEnd="10dp" android:paddingBottom="15dp" android:textColor="@color/accent_color_light" android:textColorHint="@color/secondary_text_color" android:textSize="16sp" tools:ignore="Autofill,TextFields" /> </com.google.android.material.textfield.TextInputLayout> TextInputLayout 的样式如下: <style name="TextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.FilledBox"> <item name="boxBackgroundColor">@android:color/transparent</item> <item name="background">@android:color/transparent</item> <item name="backgroundTint">@android:color/transparent</item> <item name="boxStrokeWidth">0dp</item> <item name="android:layout_marginStart">@dimen/main_side_margin</item> <item name="android:layout_marginEnd">@dimen/main_side_margin</item> <item name="android:layout_marginTop">@dimen/label_to_field_margin</item> <item name="colorAccent">@android:color/white</item> <item name="errorTextAppearance">@style/ErrorText</item> <item name="errorIconDrawable">@null</item> <item name="boxStrokeWidthFocused">0dp</item> <item name="colorControlNormal">@android:color/transparent</item> <item name="colorControlActivated">@android:color/transparent</item> <item name="colorControlHighlight">@android:color/transparent</item> <item name="android:theme">@style/ThemeOverlay.AppTheme.TextInputEditText.Outlined</item> </style> <style name="ThemeOverlay.AppTheme.TextInputEditText.Outlined" parent=""> <item name="colorControlActivated">@color/accent_color_light</item> </style> 我在这样的代码中设置文本:editMessage.setText(message.message) 如果文本很长,我会按预期有一个多行 TextInputEditText 完成编辑并单击按钮后,我执行以下操作: fun enableNextMessage(errorMsg: String?) { with(binding) { buttonSend.isEnabled = true if (errorMsg == null) { layoutReply.isVisible = false inputMessage.startIconDrawable = null editText.text = null } else showWarning(false, errorMsg) } } 问题在于 editText 大小保持为多行且具有最大行数。 我尝试通过以下方式设置editMessageheight: editMessage.layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT 没有帮助 执行以下操作会有所帮助: binding.editMessage.layoutParams.height = resources.getDimensionPixelSize(R.dimen.default_input_size) 但是当然,在那之后 editMessage 不再是多行的,并且不会改变它的大小。 我尝试设置固定高度,然后设置WRAP_CONTENT。它不起作用。一旦我设置了 WRAP_CONTENT,它就会恢复到更大的尺寸。 有帮助的是摆脱 TextInputLayout 并只留下 TextInputEditText
如何从 jetpack compose 更改 OutlinedTextField 的轮廓颜色?
这是 OutlinedTextField 代码在 jetpack-compose 中的样子: 大纲文本字段( 值=“”, onValueChange = {}, 标签 = {文本(“输入”)} ) 默认颜色...
设备旋转后,AutoCompleteTextView 下拉列表不显示
我有以下 AutoCompleteTextView: 我有以下 AutoCompleteTextView: <com.google.android.material.textfield.TextInputLayout android:id="@+id/offering_type_dropdown_layout" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/date_card_spacing" android:layout_marginStart="4dp" app:layout_constraintStart_toEndOf="@+id/offering_details_header_image" app:layout_constraintEnd_toStartOf="@+id/offering_details_date_layout" app:layout_constraintTop_toTopOf="parent" android:hint="@string/offering_type_hint"> <AutoCompleteTextView android:id="@+id/offering_details_type_dropdown" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="textNoSuggestions" android:clickable="false" android:focusable="false" android:focusableInTouchMode="false" android:cursorVisible="false"/> </com.google.android.material.textfield.TextInputLayout> 在我的 Activity 的 onCreate 中,我像这样填充 AutoCompleteTextView: String[] TYPES = new String[] {getString(R.string.burnt_offering), getString(R.string.meal_offering), getString(R.string.peace_offering), getString(R.string.sin_offering)}; ArrayAdapter<String> adapter = new ArrayAdapter<>(OfferingInputActivity.this, R.layout.offering_types_dropdown, TYPES); mOfferingTypeCombo.setAdapter(adapter); 然后我使用 Room 数据库填充视图并预选其中一个值。在房间回调中,我这样做: mOfferingTypeCombo.setText(getString(R.string.meal_offering)), false); 首次运行时一切正常,下拉列表显示正确: 现在我将设备旋转到横向。执行与上面完全相同的代码但是这次,下拉框仅显示当前选择: 由于某种原因,适配器中的所有其他条目都消失了。在设置适配器之前,我尝试过诸如setAdapter(null)之类的技巧,但没有成功。 有人可以告诉我为什么旋转后,即使执行完全相同的代码,下拉菜单也会缺少条目? 这个习俗MaterialAutoCompleteTextView 解决所有问题: class ExposedDropdownMenu : MaterialAutoCompleteTextView { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( context, attrs, defStyleAttr ) override fun getFreezesText(): Boolean { return false } init { inputType = InputType.TYPE_NULL } override fun onSaveInstanceState(): Parcelable? { val parcelable = super.onSaveInstanceState() if (TextUtils.isEmpty(text)) { return parcelable } val customSavedState = CustomSavedState(parcelable) customSavedState.text = text.toString() return customSavedState } override fun onRestoreInstanceState(state: Parcelable?) { if (state !is CustomSavedState) { super.onRestoreInstanceState(state) return } setText(state.text, false) super.onRestoreInstanceState(state.superState) } private class CustomSavedState(superState: Parcelable?) : BaseSavedState(superState) { var text: String? = null override fun writeToParcel(out: Parcel, flags: Int) { super.writeToParcel(out, flags) out.writeString(text) } } } 来源 注意: 它可能无法在 23 或更低版本等较旧的 API 中正常工作。 一种方法是使用自定义 ArrayAdapter 来防止 Filter 文本。 class NoFilterArrayAdapter : ArrayAdapter<Any?> { constructor(context: Context, resource: Int) : super(context, resource) constructor(context: Context, resource: Int, objects: Array<out Any?>) : super(context, resource, objects) override fun getFilter(): Filter { return object : Filter() { override fun performFiltering(constraint: CharSequence?): FilterResults? { return null } override fun publishResults(constraint: CharSequence?, results: FilterResults?) {} } } } 用途: val adapter = NoFilterArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, items) 目前此主题有一个未解决的错误。 您可以使用 setFreezesText 方法作为解决方法: AutoCompleteTextView autoCompleteTextView = view.findViewById(R.id.offering_details_type_dropdown); autoCompleteTextView.setFreezesText(false); EditText 设置freezesText=true。由于旋转后的这个值,TextView#onRestoreInstanceState(Parcelable)调用autoCompleteTextView.setText(value,true),它将过滤器应用于适配器值。 就像 @Gabriele Mariotti 提到的,这是一个错误。正如发布的链接中提到的,我做了这个效果很好的解决方法: public class ExposedDropDown extends MaterialAutoCompleteTextView { public ExposedDropDown(@NonNull final Context context, @Nullable final AttributeSet attributeSet) { super(context, attributeSet); } @Override public boolean getFreezesText() { return false; } } 我通过从 AutoCompleteTextView 中删除 id 解决了这个问题。这个id负责保存旋转后的文本。 在 onSaveInstanceState 方法中保存来自 AutoCompleteTextView 的字符串。 代码: <com.google.android.material.textfield.TextInputLayout android:id="@+id/inputAddress" style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/Address"> <AutoCompleteTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="none" /> </com.google.android.material.textfield.TextInputLayout> list_item.xml <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:ellipsize="end" android:maxLines="1" android:textAppearance="?attr/textAppearanceSubtitle1" /> 片段.类 class CashierAddFragment : Fragment() { var mBinding: FragmentCashierAddBinding? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val binding = FragmentCashierAddBinding.inflate(inflater, container, false) if(savedInstanceState == null) { initAddressSpinner(binding, "") } else { initAddressSpinner(binding, savedInstanceState.getString(KEY_ADDRESS)) } mBinding = binding return binding.root } override fun onSaveInstanceState(outState: Bundle) { val address = mBinding!!.inputAddress.getTrimText() outState.putString(KEY_ADDRESS, address) super.onSaveInstanceState(outState) } private fun initAddressSpinner(binding: FragmentCashierAddBinding, initValue: String?) { val items = listOf("Option 1", "Option 2", "Option 3", "Option 4") val adapter = ArrayAdapter(requireContext(), R.layout.list_item, items) val autoTxtAddress = binding.inputAddress.editText as? AutoCompleteTextView autoTxtAddress?.setText(initValue) autoTxtAddress?.setAdapter(adapter) } } @Mohsents 提出的解决方案对我有用。这是我使用的他的代码的java版本: public class NoFilterArrayAdapter extends ArrayAdapter<Object> { public NoFilterArrayAdapter(Context context, int resource) { super(context, resource); } public NoFilterArrayAdapter(Context context, int resource, Object[] objects) { super(context, resource, objects); } @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { return null; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { } }; } } 要在方向更改时解决此问题,请在 XML 中添加此内容 android:saveEnabled =“假”
我正在开发一个android应用程序,我使用TextInputLayouts来获取用户的输入,在api级别24上测试它时它不会引起任何问题,但是当我尝试在最新的手机上测试它时一些