2010-01-24 14 views
17

Vì vậy, tôi đã xem xét và phát hiện ra rằng android.R.styleable không còn là một phần của SDK ngay cả khi nó vẫn được ghi lại here.Làm cách nào để sử dụng obtainStyledAttributes (int []) với Chủ đề nội bộ của Android

Điều đó sẽ không thực sự là vấn đề nếu được ghi rõ tài liệu thay thế là gì. Ví dụ Lịch AOSP App vẫn sử dụng android.R.styleable

// Get the dim amount from the theme 
TypedArray a = obtainStyledAttributes(com.android.internal.R.styleable.Theme); 
lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f); 
a.recycle(); 

Vậy làm thế nào người ta sẽ nhận được backgroundDimAmount mà không nhận được sự int[] từ android.R.styleable.Theme?

Tôi phải gắn gì vào obtainStyledAttributes(int []) để làm cho nó hoạt động với SDK?

+0

Cùng một vấn đề tồn tại với hướng dẫn trong Chế độ xem thư viện, tôi đã thấy cách giải quyết giúp hướng dẫn hoạt động nhưng không giải thích cách hướng dẫn sẽ phải được khắc phục chỉ sử dụng các lớp SDK và không thêm lớp của riêng bạn xml với phong cách trong đó. Hướng dẫn có tại http://developer.android.com/resources/tutorials/views/hello-gallery.html mã nằm trong "ImageAdapter (Ngữ cảnh c)" Constructor – AGrunewald

+0

Đây là thảo luận tương tự http://stackoverflow.com/q/8793183/1307690 – Lemberg

Trả lời

12

API bản demo CustomView cho thấy làm thế nào để lấy các thuộc tính kiểu. Mã cho quan điểm là ở đây:

https://github.com/android/platform_development/blob/master/samples/ApiDemos/src/com/example/android/apis/view/LabelView.java

Mảng styleable sử dụng để lấy các văn bản, màu sắc và kích thước được định nghĩa trong <declare-styleable> phần ở đây:

https://github.com/android/platform_development/blob/master/samples/ApiDemos/res/values/attrs.xml#L24

Bạn có thể sử dụng <declare-styleable> để xác định bất kỳ danh sách thuộc tính nào bạn muốn truy xuất dưới dạng nhóm, chứa cả thuộc tính của bạn và thuộc tính được xác định bởi nền tảng.

Theo như những điều này trong tài liệu, có rất nhiều tài liệu java xung quanh mảng có thể tạo kiểu giúp chúng hữu ích trong tài liệu, vì vậy chúng đã bị bỏ lại ở đó. Tuy nhiên khi các mảng thay đổi, chẳng hạn như các thuộc tính mới được thêm vào, các giá trị của các hằng số có thể thay đổi, do đó các giá trị nền tảng không thể nằm trong SDK (và vui lòng không sử dụng bất kỳ thủ thuật nào để thử truy cập chúng). Tuy nhiên, không cần phải sử dụng nền tảng này, bởi vì chúng chỉ có ở đó để thực hiện các phần của khung công tác, và nó là tầm thường để tạo ra các phần của riêng bạn như được hiển thị ở đây.

+2

Cảm ơn bạn đã biết thông tin, giúp hoàn toàn một chút. Theo như tôi hiểu được, tạo ra Xml Styleable với ví dụ. một thuộc tính là "android: backgroundDimAmount" cho phép Ứng dụng truy xuất Dữ liệu chính xác. Đối với những thứ đang có trong SDK. Tôi hiểu rằng có rất nhiều Tài liệu có giá trị nhưng giải thích lý do Lớp nằm trong tài liệu SDK chứ không phải trong SDK thực tế ngay trong Tham chiếu API có thể xóa mọi thứ cho Nhà phát triển trong tương lai, vì vẫn có hướng dẫn làm điều đó sai: http://developer.android.com/intl/zh-CN/resources/tutorials/views/hello-gallery.html – AGrunewald

+0

@hackbod Liên kết đầu tiên trong câu trả lời là lỗi thời. – Pang

4

Dường như đây là lỗi trong SDK. Tôi đã gửi một số issue trên đó, mà bạn có thể muốn gắn dấu sao để nhận thông tin cập nhật về nó.

Là một worksaround, bạn có thể sử dụng phản ánh để truy cập trên sân:

Class clazz=Class.forName("android.R$styleable"); 
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz); 
+0

Cũng theo Dianne Hackborn, nó đã bị xóa khỏi SDK bằng cách ẩn nó đi. Tại đây Cuộc thảo luận về nó http://groups.google.com/group/android-developers/tree/browse_frm/thread/6554c6688f3ca6d9/8d018aa3f5c2beb9?rnum=1&_done=%2Fgroup%2Fandroid-developers%2Fbrowse_frm%2Fthread%2F6554c6688f3ca6d9% 3Ftvc% 3D1% 26 # doc_72f29c1df624bbed Vì vậy, có cách nào để làm điều đó đúng cách mà không sử dụng phản chiếu không? – AGrunewald

+0

Nếu bị cố ý, bạn không nên sử dụng nó. Các ứng dụng nội bộ (ví dụ: Lịch) có thể sử dụng ứng dụng, vì chúng không bị hạn chế sử dụng SDK. Ngoài ra, tôi không có lời khuyên, xin lỗi. Tôi đã cập nhật vấn đề này để cố gắng nhận được một số câu trả lời. – CommonsWare

+2

Cảm ơn, ya Tôi đồng ý tôi không nên sử dụng nó nhưng sau đó phải có một thay thế. Và Hướng dẫn xem thư viện cần được cập nhật một thời gian dài trước đây, vì nó vẫn hiển thị mã đó. – AGrunewald

13

Trong ví dụ này, họ bỏ qua các tham chiếu đến bối cảnh 'c':

public ImageAdapter(Context c) { 
    mContext = c; 
    TypedArray a = c.obtainStyledAttributes(R.styleable.GalleryPrototype); 
    mGalleryItemBackground = a.getResourceId(
      R.styleable.GalleryPrototype_android_galleryItemBackground, 0); 
    a.recycle(); 
} 

Thay đổi obtainStyledAttributes để c.obtainStyledAttributes nên làm việc

+2

Tôi biết điều này đến trễ, nhưng đây là câu trả lời đúng !!! –

7

Ví dụ về kéo ra thuộc tính tiêu chuẩn (background) trong một chế độ xem tùy chỉnh có kiểu mặc định riêng. Trong ví dụ này, chế độ xem tùy chỉnh Mật khẩuGrid kéo dài GridLayout. Tôi đã chỉ định kiểu cho PasswordGrid đặt hình nền bằng thuộc tính android chuẩn android: background.

public class PasswordGrid extends GridLayout { 

    public PasswordGrid(Context context) { 
     super(context); 
     init(context, null, 0); 
    } 

    public PasswordGrid(Context context, AttributeSet attrs) { 
     super(context, attrs, R.attr.passwordGridStyle); 
     init(context, attrs, 0); 
    } 

    public PasswordGrid(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(context, attrs, defStyle); 
    } 

    private void init(Context context, AttributeSet attrs, int defStyle) { 
     if (!isInEditMode()) { 

      TypedArray stdAttrs = context.obtainStyledAttributes(attrs, 
        new int[] { android.R.attr.background }, // attribute[s] to access 
        defStyle, 
        R.style.PasswordGridStyle); // Style to access 

      // or use any style available in the android.R.style file, such as 
      //  android.R.style.Theme_Holo_Light 

      if (stdAttrs != null) { 
       Drawable bgDrawable = stdAttrs.getDrawable(0); 
       if (bgDrawable != null) 
        this.setBackground(bgDrawable); 
       stdAttrs.recycle(); 
      } 
     } 
    } 

Đây là một phần phong cách của tôi.xml file:

<declare-styleable name="passwordGrid"> 
    <attr name="drawOn" format="color|reference" /> 
    <attr name="drawOff" format="color|reference" /> 
    <attr name="pathWidth" format="integer" /> 
    <attr name="pathAlpha" format="integer" /> 
    <attr name="pathColor" format="color" /> 
</declare-styleable> 



    <style name="PasswordGridStyle" parent="@android:style/Widget.GridView" > 
     <!-- Style custom attributes. --> 
     <item name="drawOff">@drawable/ic_more</item> 
     <item name="drawOn">@drawable/ic_menu_cut</item> 
     <item name="pathWidth">31</item> 
     <item name="pathAlpha">129</item> 
     <item name="pathColor">@color/green</item> 

     <!-- Style standard attributes --> 
     <item name="android:background">@drawable/pattern_bg</item> 
</style>