2010-09-15 42 views
8

Tôi muốn biết liệu có cách chèn/chèn một phần tử <string> được xác định trong tệp XML vào một phần tử <string> khác, làm điều đó chỉ với XML.Android: Cách chèn phần tử <string> vào thành phần <string> khác trong XML?

Ví dụ tôi có thể có:

<string name="author">Francesco</string>` 

và tôi đang tìm kiếm một cái gì đó như:

<string name="about_application">Author: @string/author</string>` 

để getString(R.string.about_application) sẽ cho kết quả trong "Tác giả: Francesco".

Tôi biết rằng tôi có thể kết hợp hai yếu tố trong mã Java sử dụng String.format(string, formatArgs) như ví dụ:

<string name="author">Francesco</string> 
<string name="about_application">Author: %1$s</string>` 

và sau đó trong mã sử dụng

String.format(getString(R.string.about_application), getString(R.string.author)) 

nhưng tôi muốn làm điều đó trong XML trực tiếp.

Có ai có thể gợi ý cho tôi cách để làm điều đó không?

Trả lời

14

Nếu tôi hiểu những gì bạn đang tìm kiếm, thì internal (parsed) general entities có thể giúp bạn đạt được những gì bạn đang tìm kiếm.

Một ví dụ về cách bạn có thể xác định giá trị "Francesco" như một thực thể gọi là "auth" và sau đó sử dụng nó trong XML của bạn:

<?xml version="1.0"?> 
<!DOCTYPE doc [ 
    <!ENTITY auth "Francesco"> 
]> 
<doc> 
    <string name="author">&auth;</string> 
    <string name="about_application">Author: &auth;</string> 
</doc> 

Khi đọc bởi một phân tích cú pháp XML, tài liệu sẽ được phân tích cú pháp và đánh giá, hoặc "nhìn thấy", như:

<?xml version="1.0"?> 
<doc> 
    <string name="author">Francesco</string> 
    <string name="about_application">Author: Francesco</string> 
</doc> 
+0

Cảm ơn bạn! Nó hoạt động tốt khi tôi tham chiếu một thực thể nội bộ từ một phần tử xml trong cùng một tệp, trong khi tôi đang gặp sự cố để tham chiếu một thực thể ngoài được xác định trong tệp xml khác. Dù sao, tôi không chắc liệu loại cơ chế này có nên được sử dụng với các tệp Android/res/values ​​/ xml hay không, tôi nghĩ rằng nó hơi xa một chút so với cách quản lý chúng của Android. –

+2

Điều này giống như một hướng dẫn trên đầu trang của các hướng dẫn :-). Vấn đề có thể là khi dịch string.xml (bản sao trong các thư mục khác), bạn quên bản địa hóa &auth;. Bên cạnh đó, mọi bản dịch vẫn cần tất cả các thẻ chuỗi có chứa &auth; sau đó. Nhưng yeah, đó là tốt nhất có thể bởi vì nó phải là tĩnh (vì vậy các tập tin xml có thể được thực hiện nhị phân). – pjv

1

Rất tiếc, tôi không nghĩ điều đó là có thể. Tôi đã hỏi một số similar question một thời gian trước đây và được thông báo là không thể.

+0

Cảm ơn bạn! Trên thực tế tôi cũng nghĩ rằng không có cách tiêu chuẩn để làm điều đó, ngay cả khi "lừa" Mads Hansen đề xuất có thể làm công việc. –

0

Gradle Plugin 0.10 mang lại những gì họ gọi manifestPlaceholders mà về cơ bản những gì bạn cần làm việc nhưng tính năng này hiện chỉ trong AndroidManifest. Mặc dù có an issue opened targeting the next Android build version 1.4 (1.3 hiện đang ở giai đoạn beta4 nên gần RC1 và có thể sớm thấy 1.4 beta1).

Sự cố này sẽ mở rộng trình giữ chỗ trong tệp cấu hình xml (Tôi chỉ cầu nguyện điều này sẽ bao gồm tệp chuỗi và không chỉ cấu hình xml cơ bản).

Từ: http://tools.android.com/tech-docs/new-build-system

Đối với placeholders tùy chỉnh thay thế, sử dụng DSL sau để configure giữ chỗ giá trị:

android { 
     defaultConfig { 
      manifestPlaceholders = [ activityLabel:"defaultName"] 
     } 
     productFlavors { 
      free { 
      } 
      pro { 
       manifestPlaceholders = [ activityLabel:"proName" ] 
      } 
     } 

sẽ thay thế các placeholder trong khai báo sau :

<activity android:name=".MainActivity"> android:label="${activityLabel}" >

Không thể đợi để dùng thử. Bằng cách này, bạn có thể đặt trình giữ chỗ trong nhiều lần xuất hiện trong tệp chuỗi và xác định giá trị chỉ ở một nơi thay vì sửa đổi tất cả các tệp java để thêm đối số với% 1 $ s

Hiện tại, giải pháp sạch duy nhất là mặc dù thực thể lừa nhưng điều này sẽ không hoạt động nếu bạn muốn ghi đè lên giá trị trong các hương vị vì thực thể phải được xác định trong cùng một tệp xml.

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