以编程方式将 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 ID

如何以编程方式在 dp 中设置 EditText 上边距?

以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然

Android - 我无法以编程方式设置 EditText 布局宽度

检测 EditText 的内容是由用户更改还是以编程方式更改?

在android中以编程方式将EditText视图约束到复选框?