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)。