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

时间:2015-02-06 14:48:36

标签: android android-layout android-edittext android-custom-view

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

我有以下布局:

<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的颜色不同,正常版本在聚焦时有青色下划线,自定义版本有黑色下划线:

enter image description here

enter image description here

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

编辑/更新:

支持库中的

Google seems to have adressed this,其中包括AppCompatEditText类。

2 个答案:

答案 0 :(得分:6)

  

为什么会发生这种情况

因为您正在使用AppCompat。引用the blog post on the subject

  

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

     

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

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

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

  

我该如何预防?

关闭袖口:

  • 不要创建EditText

  • 的子类
  • 在AppCompat上运行时,查找色调并找出如何自己应用它,也许是通过检查AppCompat源代码(假设它可用 - 我还没有找到它) ),或

  • 请勿使用AppCompat,并在Android 5.0及更高版本设备上使用Theme.Material查看着色是否按预期工作

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

答案 1 :(得分:5)

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

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