5

Trong dự án của tôi (Nhắm mục tiêu API 21 có hỗ trợ AppCompat), tôi cần mở rộng lớp EditText. Vấn đề của tôi là MyEditText lớp không kế thừa EditText phong cách tùy chỉnh với:Thừa kế kiểu mở rộng Widget

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar" > 
    <item name="colorPrimary">@color/primary</item> 
    <item name="colorControlNormal">@color/grey_light</item> 
    <item name="colorControlActivated">@color/primary</item> 
    <item name="colorControlHighlight">@color/primary</item> 
</style> 

với @color/primary xanh


Ảnh chụp màn hình:

enter image description here

  • dòng 1: EditText tập trung
  • dòng 2: EditText không tập trung (kích hoạt)
  • dòng 3: MyEditText không tập trung (kích hoạt)

Câu hỏi của tôi là: Làm thế nào tôi có thể kế thừa EditText phong cách mặc định trong MyEditText?

+1

AppCompat sử dụng một LayoutInflater tùy chỉnh thay thế việc thực hiện EditText có màu sắc của riêng nó khi nó thấy một phần tử EditText. Thật không may là lớp này không được công khai, cũng không phải là các lớp cần thiết để tạo TextText tùy chỉnh của riêng bạn, vì vậy tốt nhất bạn có thể làm ngay bây giờ là gửi yêu cầu tính năng chống lại appcompat trên [AOSP issue tracker] (https: // code) .google.com/p/android/issues/list) – alanv

+0

Cảm ơn sự giúp đỡ của bạn, tôi đã mở một vé https://code.google.com/p/android/issues/detail?id=80114 – alex

Trả lời

6

Có cách rất, rất, rất dễ dàng.

Thay vì kế thừa từ android.widget.EditText Tuỳ chỉnh EditText của bạn, kế thừa lớp này và xem nếu nó hoạt động:

android.support.v7.internal.widget.TintEditText 

Liên kết với các lớp: TintEditText.java

đọc Javadoc của lớp, ông nói:

/** 
* An tint aware {@link android.widget.EditText}. 
* <p> 
* This will automatically be used when you use {@link android.widget.EditText} in your 
* layouts. You should only need to manually use this class when writing custom views. 
*/ 

trong căng của trang này (Using Support Library APIs) có một cách thận trọng là: Khi sử dụng các lớp từ Thư viện Hỗ trợ, hãy chắc chắn bạn nhập lớp từ gói thích hợp.Ví dụ: khi áp dụng lớp ActionBar:

  • android.support.v7.app.ActionBar khi sử dụng Thư viện hỗ trợ.
  • android.app.ActionBar khi chỉ phát triển cho cấp API 11 trở lên.

Tôi hiểu điều này, nghĩa là, nếu bạn đang sử dụng thư viện hỗ trợ, hãy luôn cố gắng nhập hoặc kế thừa gói thích hợp. (Không có gì ít hơn đó là viết lol .: D)

+0

Giải pháp đơn giản và hoàn hảo, chắc chắn là tốt nhất cho vấn đề này. +1 = D –

+1

Cảm ơn câu trả lời –

3

Bạn có thể làm việc xung quanh nó bằng cách sử phong cách

Trong Theme của bạn

<style name="AppTheme.BaseNoActionBar" parent="Theme.AppCompat.Light"> 
    <item name="android:editTextStyle">@style/Widget.EditText</item> 
</style> 


<!-- EditText style --> 
<style name="Widget.EditText" parent="Widget.AppCompat.EditText"> 
    <item name="android:textCursorDrawable">@drawable/cursor_gray</item> 
    <item name="android:background">@drawable/underline_gray</item> 
</style> 

sau đó xác định con trỏ

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" > 
    <size android:width="1dp" /> 
    <solid android:color="@color/lightGrayLabel" /> 
</shape> 

và drawable theo này hack https://stackoverflow.com/a/20891131

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:top="-6dp" android:left="-6dp" android:right="-6dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@android:color/transparent"/> 
      <stroke android:color="@color/lightGrayLabel" android:width="3dp"/> 
     </shape> 
    </item> 
</layer-list> 

Tôi cũng đã cố gắng sử dụng selector như lĩnh vực "nền", nhưng nó đã không làm việc với một trong hai "android: state_selected" hoặc "android: state_activated"

Dưới đây là một ví dụ nhỏ

Before

After

+0

Cảm ơn bạn, điều này là điều cuối cùng tôi đã làm. – alex

Các vấn đề liên quan