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

asc*_*sco 5 android android-custom-view android-layout android-edittext

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

我有以下布局:

<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>
Run Code Online (Sandbox Code Playgroud)

这个类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);
    }


}
Run Code Online (Sandbox Code Playgroud)

styles.xml除主题外,我的文件为空

<resources>

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

</resources>
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

在此输入图像描述

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

编辑/更新:

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

Com*_*are 6

为什么会这样呢?

因为您正在使用AppCompat.引用关于该主题的博客文章:

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

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

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

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

我该怎样预防呢?

脱下袖口,或者:

  • 不要创建EditText,或的子类

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

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

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


Bil*_*lly 5

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

如果要创建EditText的子类,则应该继承AppCompatEditText(android.support.v7.widget.AppCompatEditText)的子类.