【问题标题】:Child class of EditText looks different than normal EditText on Android 4EditText 的子类看起来与 Android 4 上的普通 EditText 不同
【发布时间】:2015-04-06 17:56:53
【问题描述】:

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

我有以下布局:

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

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

编辑/更新:

Google seems to have adressed this 在支持库中引入 AppCompatEditText 类等。

【问题讨论】:

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


    【解决方案1】:

    为什么会这样

    因为您使用的是 AppCompat。引用the blog post on the subject:

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

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

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

    因此,该行为是预期的。 AppCompat 向后移植提供了一些轻量级的着色向后移植,但它不能处理所有情况。

    如何预防?

    即开即用:

    • 不要创建EditText的子类,或者

    • 在 AppCompat 上运行时,查找色调并弄清楚如何自己应用它,也许可以通过检查 AppCompat 源代码(假设它可用——我没有寻找它),或者

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

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

    【讨论】:

    • 哇,你已经准备好这个答案了吗? :) 非常感谢!
    • @Ascorbin:“哇,你准备好这个答案了吗?” ——嗯,它是半个引号,这样可以节省打字时间。 :-) 我需要在某个时候自己查看我的第二个选项,因为我有 a subclass of EditText 会遇到同样的问题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      相关资源
      最近更新 更多