Đặt một kiểu nhất quán cho tất cả EditText (ví dụ:)


84

Tôi đang cố gắng làm cho tất cả EditTextnhững thứ trong ứng dụng của mình có giao diện nhất quán. Tôi biết rằng tôi có thể làm điều gì đó như sau:

<style name="App_EditTextStyle">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>

Sau đó, tôi có thể làm cho một cụ thể EditTextcó phong cách này bằng cách làm như sau:

<EditText ...
    style="@style/App_EditTextStyle
    ...>

Nhưng theo cách này, tôi phải nhớ thiết lập kiểu riêng cho từng cái EditTexttrong ứng dụng của mình, điều này rất tẻ nhạt, nếu không muốn nói là dễ xảy ra lỗi.

Có cách nào để tôi có thể biến nó thành một phần của chủ đề hay thứ gì đó không? Điều này là do đó tôi không phải liên kết phong cách này với mọi EditText. Một cái gì đó giống như khối mã hư cấu này:

<style name="App_Theme" parent="@android:style/Theme.Holo">
   ... 
   <item name="android:EditTextSyle">@style/App_EditTextStyle</item>
   ...
<style>

Và sau đó trong tôi AndroidManifest.xmlcó một cái gì đó như:

<application
    ....
    android:theme="@style/App_Theme">

Và Voila! tất cả của tôi EditTextđều có kiểu nhất quán mà tôi không cần phải chỉ định kiểu cho từng trường hợp.

Câu trả lời:


155

Ghi đè thuộc tính trỏ đến EditTextkiểu (có tên editTextStyle:)) trong chủ đề tùy chỉnh của bạn:

<style name="App_Theme" parent="@android:style/Theme.Holo">
   <item name="android:editTextStyle">@style/App_EditTextStyle</item>
</style>

và tạo kiểu tùy chỉnh của bạn để mở rộng Widget.EditText:

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>

Biên tập:

Nếu bạn đang sử dụng các chủ đề liên quan đến AppCompat mới hơn nhiều, hãy sử dụng thuộc tính editTextStyle mà không có tiền tố android:

<style name="App_Theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

3
Điều này nghe có vẻ hợp lý và hợp lý, nhưng nó dường như không hiệu quả với tôi. Tôi có thể bị thiếu một cái gì đó?
Code Nhà thơ

1
@ManishGupta Làm thế nào chính xác là không hoạt động? Tôi đã thử nghiệm các phong cách ở trên và chúng hoạt động, NHƯNG layout_height/heightkhông thể đưa vào đó vì android có thể kiểm tra các thuộc tính đó trước các phong cách của chủ đề và nó sẽ phàn nàn về việc chúng bị thiếu. Nhưng một tùy chỉnh có thể vẽ + màu văn bản khác sẽ hoạt động với những điều trên.
người dùng

Tôi có mọi thứ được thiết lập chính xác như bạn mô tả. Tôi không có ích gì khi đăng lại. Tôi đang đưa cái này cho bạn dù sao. Tôi đang thiếu một cái gì đó ở đâu đó. Những gì bạn quy định là logic lạnh và nên hoạt động. Tôi sẽ xem lại điều này sau khi làm mát. Cảm ơn.
Code Nhà thơ

3
@ toobsco42 edittextStylekhông áp dụng cho một AutoCompleTextView(mặc dù đó là một EditText). Hãy xem autoCompleteTextViewStylethuộc tính trong theme.xml trỏ đến một Widget.AutoCompleTextViewkiểu trong tệp style.xml.
người dùng

3
Không làm việc cho tôi quá. Nhưng nếu tôi đổi <item name="android:editTextStyle">thành <item name="editTextStyle">, thì không sao. Cảm ơn!
Sam Sch

52

Câu trả lời @Luksprog là đúng nhưng không hiệu quả với tôi. Sau một số thử nghiệm, tôi phát hiện ra rằng việc xóa không gian tên android khỏi editTextStyle đã làm cho nó hoạt động với tôi.

<style name="App_Theme" parent="@android:style/Theme.Holo">
   <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

và tạo kiểu tùy chỉnh của bạn để mở rộng Widget.EditTexthoặc nếu sử dụng chủ đề AppCompat Widget.AppCompat.EditText:

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>

1
Làm việc cho tôi quá. Nhưng tại sao nó lại cư xử như vậy?
Eagle_Eye

3
Có thể có một cái gì đó để làm với AppCompatthư viện. Hoạt động của bạn có kéo dài AppCompatActivitykhông? Ôi những bí ẩn của sự phát triển Android.
Matt Zukowski

1
@MattZukowski đã thực hiện một số hoạt động đào dựa trên nhận xét của bạn - thủ phạm có thể xảy ra: Từ AppCompat v7:21+trở đi, các thuộc tính chủ đề chuẩn cần được sử dụng mà không có tiền tố "android:" trong các kiểu.
iflp

Cảm ơn vì điều này.
Adam Varhegyi

Hoạt động tốt ngay cả khi không sử dụng Widget.AppCompat.EditText .. Nhưng tôi không thể truy cập Widget.AppCompat.EditText. Nói "không thể phân giải biểu tượng '@android: style / Widget.AppCompat.EditText'"
Neri

18

Đầu tiên, xác định kiểu cho EditText của bạn. Đảm bảo rằng kiểu gốc làandroid:Widget.EditText

<style name="CustomEditTextStyle" parent="android:Widget.EditText">

    <item name="android:textColor">#0F0F0F</item>
    <!-- ... More items here if needed ... -->
</style>

Sau đó, ghi đè thuộc tính android:editTextStyletrong chủ đề tùy chỉnh của bạn. Hãy lưu ý, nếu bạn đang sử dụng thư viện hỗ trợ, bạn cũng sẽ cần ghi đè thuộc tính editTextStyle(không có vùng tên android).

<style name="App_Theme" parent="...">
   <item name="android:editTextStyle">@style/CustomEditTextStyle</item>
   <item name="editTextStyle">@style/CustomEditTextStyle</item> <!-- For compatibility with the support library -->
</style>

1

Nếu bạn chỉ cần đặt một vài tham số đơn giản, chẳng hạn như màu văn bản, thì không gian tên Android có một vài tham số sẽ làm điều đó mà không cần khai báo một kiểu riêng cho văn bản chỉnh sửa. Ví dụ

<style name="MyStyle" parent="android:Theme.Material.NoActionBar">
    <item name="colorPrimary">@color/black</item>
    <item name="colorPrimaryDark">@color/white</item>
    <item name="colorAccent">@color/white</item>
    <item name="android:textColor">@color/black</item>
    <item name="android:editTextColor">@color/black</item>
    <item name="android:editTextBackground">@color/black</item>
    ....
</style>

Đối với phiên bản AppCompat mới hơn, hãy sử dụng editTextColorvà gỡ bỏ android:.
Armin

-2
<style name="App_Theme" parent="@android:style/Theme.Holo">    
    <item name="android:editTextBackground">@drawable/filled_roundededges_box_dark</item>
</style>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.