5

这是我在实际应用程序中发现的'错误',但是我创建了一个空白项目来重现它。EditText的子类与Android上的EditText看起来不一样4

我有以下布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:id="@+id/root" 
    android:orientation="vertical" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <com.example.test.testapp.MyEditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 


</LinearLayout> 

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); 
    } 


} 

styles.xml文件是空的,除了主题

<resources> 

    <!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <!-- Customize your theme here. --> 
    </style> 

</resources> 

我期望MyEditText看起来像正常的EditText,它在Android 5.0上运行,但不在Android 2.3.7,Android 4.1.3或Android 4.4.4上运行。

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

enter image description here

enter image description here

这是为什么发生,我怎样才能防止它?

编辑/ UPDATE:

谷歌seems to have adressed this在引进,除其他外,一个AppCompatEditText类支持库。

回答

6

这究竟是为什么

由于您使用的程序兼容性。引用the blog post on the subject

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

答:在AppCompat中着色的部件通过拦截任何布局通货膨胀并在其位置插入一个特殊的色调感知版本的小部件来工作。对于大多数人来说,这将正常工作,但我能想到的几种情况中,这是行不通的,包括:

  • 你widget的自己的定制版本(即你扩展的EditText)
  • 您正在创建没有LayoutInflater的EditText(即调用新的EditText())。

因此,行为是预期的。 AppCompat backport提供了一些轻量级的背景设置,但它不会处理所有情况。

我该如何预防?

即兴,或者:

  • 不要创建的EditText一个子类,或

  • 当程序兼容性运行,查找色调,并找出如何自己应用它,也许通过检查AppCompat源代码(假设它可用 - 我没有找到它),或者

  • 请勿使用AppCompat,并查看着色是否起作用使用在Android 5.0以上版本的设备

这有可能是未来的程序兼容性能够提供某种系统的子类要参加染色工序Theme.Material预期。除此之外,还可能有其他解决方案 - 这些就是我们想到的。

+0

哇,你已经准备这个答案? :)谢谢一堆! – FWeigl 2015-02-06 14:54:53

+0

@Ascorbin:“哇,你有这个答案已经准备好了吗?” - 这是报价的一半,这可以节省打字费用。 :-)我需要看我的第二个选择自己在某些时候,因为我有(https://github.com/commonsguy/cwac-richedit)的'EditText'一个子类],将来自同一患问题。 – CommonsWare 2015-02-06 14:55:45

5

其实在这里这接受的答案得出的结论并不完全正确(再)。您应该使用程序兼容性,但只需要认识到,程序兼容性将布局通胀期间AppCompatEditText代替你的EditText。同样的过程发生在其他一些UI元素太像开关,复选框等谷歌这样做,使他们能够从用户最少的代码变化远播推材质的设计外观正的感觉。

如果你想继承的EditText,你应该继承AppCompatEditText(android.support.v7.widget.AppCompatEditText)。