EditText的子类看起来与Android 4上的普通EditText不同

这是我在处理真实应用程序时发现的“错误”,但我创建了一个空白项目来重现它。

我有以下布局:

    

MyEditText类看起来像这样:

 public class MyEditText extends EditText { public MyEditText(Context context){ super(context); } public MyEditText(Context context, AttributeSet attrs){ super(context, attrs); } public MyEditText(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); } } 

除了Theme之外,我的styles.xml文件是空的

       

我希望MyEditText看起来像普通的EditText ,它在Android 5.0上,但在Android 2.3.7,Android 4.1.3或Android 4.4.4上没有。

在这些Android版本上, EditText的颜色不同,正常的一个在聚焦时有一个青色下划线,自定义版本有一个黑色下划线:

在此处输入图像描述

在此处输入图像描述

为什么会发生这种情况,我该如何预防呢?

编辑/更新:

Google 似乎在支持库中通过引入AppCompatEditText类来解决这个问题。

为什么会这样呢?

因为您使用的是AppCompat。 引用关于该主题的博客文章 :

问:为什么我的EditText(或上面列出的其他小部件)没有在我的前Lollipop设备上正确着色?

答:AppCompat中的小部件着色通过拦截任何布局膨胀并在其位置插入特殊的色调感知版本的小部件来工作。 对于大多数人来说,这样可以正常工作,但我可以想到一些不起作用的场景,包括:

  • 您有自己的小部件自定义版本(即您已扩展EditText)
  • 您正在创建没有LayoutInflater的EditText(即调用新的EditText())。

所以,行为是预期的。 AppCompat backport提供了一些轻量级的着色后移,但它不会处理所有情况。

我该怎样预防呢?

脱下袖口,要么:

  • 不要创建EditText的子类,或

  • 在AppCompat上运行时,查找色调并找出如何自己应用它,可能是通过检查AppCompat源代码(假设它可用 – 我没有find它),或者

  • 不要使用AppCompat,并使用Android 5.0+设备上的Theme.Material查看着色是否按预期工作

未来的AppCompat可能会为子类提供某种系统来参与着色过程。 可能还有其他解决方案 – 这些都是我想到的。

实际上,在这里接受的答案中得出的结论并不完全正确(不再)。 你应该使用AppCompat,但只需要意识到AppCompat会在布局膨胀期间用你的EditText替换AppCompatEditText。 同样的过程也发生在其他一些UI元素上,比如Switch,CheckBoxes等.Google这样做是为了让用户可以通过最少的代码更改来推动Material Design外观。

如果要子类化EditText,则应该inheritanceAppCompatEditText( android.support.v7.widget.AppCompatEditText )。