2016-01-19 17 views
7

Tôi đang chuẩn bị các bản vẽ cho ứng dụng của mình. Tôi đã có rất nhiều radiobutton, đang được hiển thị như hình ảnh với khung tùy chọn (khi được chọn). Một vẻ drawable như sau:Sử dụng lại các phần có thể drawable trên Android

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true"> 
     <layer-list> 
      <item> 
       <shape android:shape="rectangle"> 
        <solid android:color="@color/colorPrimary" /> 
       </shape> 
      </item> 

      <item> 
       <inset android:insetTop="@dimen/selectionBorderSize" 
        android:insetLeft="@dimen/selectionBorderSize" 
        android:insetRight="@dimen/selectionBorderSize" 
        android:insetBottom="@dimen/selectionBorderSize"> 
        <layer-list> 
         <item> 
          <shape android:shape="rectangle"> 
           <solid android:color="#ffffff"></solid> 
          </shape> 
         </item> 
         <item> 
          <bitmap android:src="@drawable/sharp7" > 
           <padding android:bottom="@dimen/selectionBorderSize" 
            android:top="@dimen/selectionBorderSize" 
            android:left="@dimen/selectionBorderSize" 
            android:right="@dimen/selectionBorderSize" /> 
          </bitmap> 
         </item> 
        </layer-list> 
       </inset> 
      </item> 
     </layer-list> 
    </item> 

    <item android:state_checked="false"> 
     <layer-list> 
      <item> 
       <shape android:shape="rectangle"> 
        <solid android:color="#ffffff" /> 
       </shape> 
      </item> 

      <item> 
       <inset android:insetTop="@dimen/selectionBorderSize" 
        android:insetLeft="@dimen/selectionBorderSize" 
        android:insetRight="@dimen/selectionBorderSize" 
        android:insetBottom="@dimen/selectionBorderSize"> 
        <layer-list> 
         <item> 
          <shape android:shape="rectangle"> 
           <solid android:color="#ffffff"></solid> 
          </shape> 
         </item> 
         <item> 
          <bitmap android:src="@drawable/sharp7" > 
           <padding android:bottom="@dimen/selectionBorderSize" 
            android:top="@dimen/selectionBorderSize" 
            android:left="@dimen/selectionBorderSize" 
            android:right="@dimen/selectionBorderSize" /> 
          </bitmap> 
         </item> 
        </layer-list> 
       </inset> 
      </item> 
     </layer-list> 
    </item> 

    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="#ffffff" /> 
     </shape> 
    </item> 
</selector> 

Một số khác:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true"> 
     <layer-list> 
      <item> 
       <shape android:shape="rectangle"> 
        <solid android:color="@color/colorPrimary" /> 
       </shape> 
      </item> 

      <item> 
       <inset android:insetTop="@dimen/selectionBorderSize" 
        android:insetLeft="@dimen/selectionBorderSize" 
        android:insetRight="@dimen/selectionBorderSize" 
        android:insetBottom="@dimen/selectionBorderSize"> 
        <layer-list> 
         <item> 
          <shape android:shape="rectangle"> 
           <solid android:color="#ffffff"></solid> 
          </shape> 
         </item> 
         <item> 
          <bitmap android:src="@drawable/sharp6" > 
           <padding android:bottom="@dimen/selectionBorderSize" 
            android:top="@dimen/selectionBorderSize" 
            android:left="@dimen/selectionBorderSize" 
            android:right="@dimen/selectionBorderSize" /> 
          </bitmap> 
         </item> 
        </layer-list> 
       </inset> 
      </item> 
     </layer-list> 
    </item> 

    <item android:state_checked="false"> 
     <layer-list> 
      <item> 
       <shape android:shape="rectangle"> 
        <solid android:color="#ffffff" /> 
       </shape> 
      </item> 

      <item> 
       <inset android:insetTop="@dimen/selectionBorderSize" 
        android:insetLeft="@dimen/selectionBorderSize" 
        android:insetRight="@dimen/selectionBorderSize" 
        android:insetBottom="@dimen/selectionBorderSize"> 
        <layer-list> 
         <item> 
          <shape android:shape="rectangle"> 
           <solid android:color="#ffffff"></solid> 
          </shape> 
         </item> 
         <item> 
          <bitmap android:src="@drawable/sharp6" > 
           <padding android:bottom="@dimen/selectionBorderSize" 
            android:top="@dimen/selectionBorderSize" 
            android:left="@dimen/selectionBorderSize" 
            android:right="@dimen/selectionBorderSize" /> 
          </bitmap> 
         </item> 
        </layer-list> 
       </inset> 
      </item> 
     </layer-list> 
    </item> 

    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="#ffffff" /> 
     </shape> 
    </item> 
</selector> 

Nếu bạn không muốn chơi "tìm thấy 2 sự khác biệt", điều duy nhất thay đổi là hình ảnh trong <bitmap> thẻ.

Tôi cảm thấy toàn bộ WET tại đây. Có cách nào để sử dụng lại một phần của điều này không?

WET, ví dụ: không phải DRY

Trả lời

6

Tóm lại: Không có tham số nào cho các đối tượng XML, do đó việc này có thể phức tạp hơn một chút.

Thông thường Tôi sẽ cố gắng tách tất cả các nội dung đơn lẻ <item> thành các tệp có thể kéo riêng biệt và sau đó bao gồm chúng với <item android:drawable="..." />. Sau đó, chúng có thể được sử dụng lại trong các đồ dùng khác.

Ví dụ, bạn có thể di chuyển mục sau vào một file riêng biệt:

<item> 
    <shape android:shape="rectangle"> 
     <solid android:color="#ffffff" /> 
    </shape> 
</item> 

Sau đó, bạn có thể bao gồm (tái sử dụng) nó bất cứ nơi nào nó là cần thiết:

<item android:drawable="@drawable/shared_drawable" /> 

Trong trường hợp của bạn tuy nhiên bạn chỉ có thể tiết kiệm ~ 10% bằng cách sử dụng phương pháp này vì các phần tử <bitmap> được chôn sâu trong hệ thống phân cấp.


Cách tiếp cận khác, hơi kỳ lạ sẽ sử dụng tác vụ Gradle để tạo nhiều bản vẽ XML từ một mẫu có thể kéo. Điều này rõ ràng yêu cầu bạn sử dụng Gradle hoặc Android Studio tương ứng.

Bạn có thể đặt tệp có thể kéo vào thư mục /res/raw (hoặc bất kỳ thư mục nào khác không gây ra sự cố). Tôi sẽ đặt tên tệp mẫu XML này là drawable_template.xml như được tham chiếu bên dưới. Trong tập tin này, chúng tôi sử dụng một mẫu Groovy biến ${bitmapdrawable} như giữ chỗ cho tên bitmap drawable thực tế của bạn:

... 
    <item> 
     <bitmap android:src="@drawable/${bitmapdrawable}"><!-- placeholder for gradle --> 
      ... 
     </bitmap> 
    </item> 
... 

Bây giờ chúng ta cần phải xác định một nhiệm vụ Gradle để sao chép các mẫu drawable đến /res/drawable thư mục thực tế với drawables bitmap mong muốn bao gồm:

def drawablesToGenerate = ['sharp5', 'sharp6', 'sharp7', 'sharp8'] // bitmap names 
task drawableTemplate << { 
    drawablesToGenerate.each { drawableName -> // for each drawable 
     copy { 
      println("copy template for ${drawableName}") 
      from 'src/main/res/raw' // source folder 
      into 'src/main/res/drawable' // target folder 
      include 'drawable_template.xml' // template file 
      // rename file to final drawable 
      rename('drawable_template.xml', "drawable_gen_${drawableName}.xml") 
      expand(bitmapdrawable: "${drawableName}") 
     } 
    } 
} 
preBuild.dependsOn drawableTemplate 

Tập lệnh đó có thể được đưa vào tệp (mô-đun) build.gradle của ứng dụng.

Bây giờ, các bản vẽ cuối cùng với các bitmap được bao gồm khác nhau được tạo từ một tệp mẫu duy nhất tại thời gian biên dịch. Họ có tên drawable_gen_sharpX.xml và có thể được sử dụng như là đồ dùng thông thường.

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