以编程方式将 EditText 的背景资源设置为透明字段
Posted
技术标签:
【中文标题】以编程方式将 EditText 的背景资源设置为透明字段【英文标题】:Programmatically Set Background Resource of EditText to transparent field 【发布时间】:2014-03-14 13:06:24 【问题描述】:这是我创建 EditText 时的默认外观:
这是我改变背景后的样子:
要将背景更改为上图,我将以下 EditText 属性添加到我的 XML 文件中的 EditText:
android:background="@android:drawable/edit_text"
我想做的是在我的活动类中做我上面所做的事情(让用户可以选择在经典样式和透明/新样式之间进行选择)。
所以像这样 - 我需要人填写/*...*/
if (classicTextbox()) // the blocky white one
editText.setTextColor(Color.BLACK);
editText.setBackgroundResource(android.R.drawable.edit_text);
else // the new transparent one
editText.setTextColor(Color.WHITE);
editText.setBackgroundResource(/*...*/);
那么如何将它改回新的、透明的 EditText 样式呢?
【问题讨论】:
【参考方案1】:我最终尝试在打开布局时仅保存原始Drawable
,然后在需要时以这种方式设置背景资源。像这样:
在我的onCreate
方法中:
Drawable originalDrawable = editText.getBackground();
然后设置它:
// need to use .setBackground and .setBackgroundDrawable depending on the
// android version because .setBackgroundDrawable is depreciated
int sdk = android.os.Build.VERSION.SDK_INT;
int jellyBean = android.os.Build.VERSION_CODES.JELLY_BEAN;
if(sdk < jellyBean)
editText.setBackgroundDrawable(originalDrawable);
else
editText.setBackground(originalDrawable);
我仍然鼓励更多答案,因为我不太喜欢这个解决方案。
来源:
How to return to default style on EditText if I apply a background?
setBackground vs setBackgroundDrawable (Android)
【讨论】:
【参考方案2】:EditText
的默认全息背景为:edit_text_holo_dark
。那是黑暗的版本。还有与之对应的精简版:edit_text_holo_light
。
edit_text_holo_dark.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_multiline="true" android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_dark" />
<item android:state_multiline="true" android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_multiline_disabled_holo_dark" />
<item android:state_multiline="true" android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_multiline_activated_holo_dark" />
<item android:state_multiline="true" android:state_enabled="true" android:state_activated="true" android:drawable="@drawable/textfield_multiline_focused_holo_dark" />
<item android:state_multiline="true" android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_dark" />
<item android:state_multiline="true" android:state_focused="true" android:drawable="@drawable/textfield_multiline_disabled_focused_holo_dark" />
<item android:state_multiline="true" android:drawable="@drawable/textfield_multiline_disabled_holo_dark" />
<item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_dark" />
<item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled_holo_dark" />
<item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_activated_holo_dark" />
<item android:state_enabled="true" android:state_activated="true" android:drawable="@drawable/textfield_focused_holo_dark" />
<item android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_dark" />
<item android:state_focused="true" android:drawable="@drawable/textfield_disabled_focused_holo_dark" />
<item android:drawable="@drawable/textfield_disabled_holo_dark" />
</selector>
请记住,这些全息元素仅适用于 Android HC+。
【讨论】:
如何像使用android.R.drawable
一样访问全息可绘制对象?我不能只为自己复制那个 xml,因为它引用了我没有的可绘制对象。【参考方案3】:
public static void setBackground(View v, int backgroundColor, int borderColor)
GradientDrawable shape = new GradientDrawable();
shape.setShape(GradientDrawable.RECTANGLE);
shape.setCornerRadii(new float[] 16, 16, 16, 16, 0, 0, 0, 0 );
shape.setColor(backgroundColor);
shape.setStroke(3, borderColor);
v.setBackground(shape);
不是精确的解决方案,而是替代方案。
【讨论】:
以上是关于以编程方式将 EditText 的背景资源设置为透明字段的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然
Android - 我无法以编程方式设置 EditText 布局宽度