Tham chiếu một chuỗi trong tài nguyên mảng chuỗi với xml


256

Tôi có các tùy chọn nơi bạn có thể bật / tắt những mục nào sẽ hiển thị trên menu. Có 17 bài. Tôi đã tạo một mảng chuỗi trong các giá trị / Arrayays.xml với các tiêu đề cho mỗi trong số 17 mục này.

Tôi có Preferences.xml có bố cục cho tệp tùy chọn của mình và tôi muốn tham chiếu một mục duy nhất từ ​​mảng chuỗi để sử dụng làm tiêu đề.

Tôi có thể làm cái này như thế nào?

Trong tham chiếu dành cho nhà phát triển Android, tôi thấy cách tôi có thể tham chiếu một chuỗi đơn với XML, nhưng không phải là cách tôi có thể tham chiếu một chuỗi từ tài nguyên mảng trong XML.

Câu trả lời:


331

Tóm lại: Tôi không nghĩ bạn có thể, nhưng dường như có một cách giải quyết : .

Nếu bạn xem Tài nguyên Android tại đây:

http://developer.android.com/guide/topics/resource/opes-resource.html

Bạn thấy hơn trong phần mảng (ít nhất là mảng chuỗi), "TÀI LIỆU THAM KHẢO" (như bạn nhận được từ một XML) không chỉ định một cách để giải quyết các mục riêng lẻ. Bạn thậm chí có thể thử trong XML của mình để sử dụng "@ mảng / yourarrayhere". Tôi biết rằng trong thời gian thiết kế, bạn sẽ nhận được mục đầu tiên. Nhưng đó không phải là sử dụng thực tế nếu bạn muốn sử dụng, giả sử ... thứ hai, tất nhiên.

TUY NHIÊN, có một mẹo bạn có thể làm. Xem tại đây:

Tham chiếu chuỗi XML trong Mảng XML (Android)

Bạn có thể "gian lận" (không thực sự) định nghĩa mảng bằng cách giải quyết các chuỗi độc lập bên trong định nghĩa của mảng. Ví dụ: trong chuỗi XML của bạn:

<string name="earth">Earth</string>
<string name="moon">Moon</string>

<string-array name="system">
    <item>@string/earth</item>
    <item>@string/moon</item>
</string-array>

Bằng cách sử dụng điều này, bạn có thể sử dụng thông thường "@ chuỗi / trái đất" và "@ chuỗi / mặt trăng" trong các trường XML "android: text" và "android: title" của bạn, nhưng bạn sẽ không mất khả năng sử dụng mảng định nghĩa cho bất cứ mục đích nào bạn dự định ở nơi đầu tiên.

Có vẻ như để làm việc ở đây trên Eclipse của tôi. Tại sao bạn không thử và cho chúng tôi biết nếu nó hoạt động? :-)


32
nếu chúng tôi chỉ có thể cung cấp namethẻ cho <item> s ... * thở dài *
Một số sinh viên Noob

2
Chỉ cần thử nó! Xác định mảng trong mặc định strings.xmlnhưng không có values-frvà mảng vẫn được cập nhật với phiên bản tiếng Pháp. Vì vậy, sai .. nhưng mát mẻ nó hoạt động!
Blundell

1
Mẹo nhanh cho bất cứ ai: Nhấp đúp chuột vào "trái đất" sẽ làm nổi bật trái đất. Nhấp đúp vào mặt trăng trong @ chuỗi / mặt trăng sẽ làm nổi bật chỉ mặt trăng. Do đó, nếu bạn sao chép một mục đầu tiên nhiều lần khi xây dựng mảng của mình, thì bạn có thể sao chép và dán giữa các chuỗi riêng lẻ và mảng chuỗi khá dễ dàng. Có thể giúp tăng tốc việc tạo chuỗi chuỗi của bạn :)
ArtOfWarfare

2
Chỉ muốn biết liệu cách tiếp cận này có gây ra hiệu năng kém hơn so với việc tôi khai báo các chuỗi trong mảng như chúng không nhưng không sử dụng các tham chiếu?
Alex Bonel

1
@AlexBonel một câu hỏi thú vị, và thật lòng tôi không biết. Ngay cả nếu có, tôi nghĩ chúng ta nên để loại tối ưu hóa rất nhỏ này cho trình biên dịch. Dù sao, họ không kết thúc ở một nơi nào đó trên đường? Tôi đoán họ làm, nhưng tôi không chắc. Ít nhất ở cấp độ cao hơn trong chuỗi Android, tôi biết bạn hoàn toàn có thể tháo rời APK bằng apktool và nó sẽ khôi phục tên gốc của các khóa chuỗi, có nghĩa là các khai báo được tham chiếu, như khai báo ở trên, được giữ nguyên. Nhưng tôi không quan tâm lắm đến lĩnh vực đó ngay bây giờ, vì vậy tôi không thể trả lời câu hỏi của bạn. Đó là một câu hỏi hay mặc dù.
davidcsb

216

Có lẽ điều này sẽ giúp:

String[] some_array = getResources().getStringArray(R.array.your_string_array)

Vì vậy, bạn nhận được danh sách mảng dưới dạng Chuỗi [] và sau đó chọn bất kỳ i, some_array [i].


10
Tôi hiểu làm thế nào để có được tài nguyên mảng. Điều đó không cho phép tôi tham chiếu mục từ mảng trong bố cục xml.
Jorsher

1
Ồ xin lỗi. Tôi đã hiểu nhầm. Vâng, nó có phải là trong bố trí xml? Nếu tiêu đề thay đổi với sự lựa chọn của người dùng, tại sao không làm điều đó trong tệp .java. Ví dụ: .setText (some_array [i]).

2
Bởi vì, bố cục tùy chọn là trong xml. Java tải menu với các mục được "bật" trong tùy chọn. Nhập 17 kiểm tra cho các tùy chọn và mã tiếp theo để thêm nó vào listview có vẻ dư thừa và cẩu thả đối với tôi.
Jorsher

Điều này rất hữu ích khi tôi tạo một mảng từ một mảng xml trong thư mục giá trị của mình
EHarpham

Tôi thấy điều này hữu ích khi cần một giá trị mặc định khi nhận ưu tiên: String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);trong đó my_pref trước đây được đặt thành một số giá trị some_array [x]
Al Lelopath

67

Tùy chọn tốt hơn là chỉ sử dụng mảng trả về tài nguyên dưới dạng một mảng, nghĩa là:

getResources().getStringArray(R.array.your_array)[position]

Đây là một cách tiếp cận ngắn gọn của các phương pháp đã đề cập ở trên nhưng thực hiện công việc theo cách bạn muốn. Mặt khác, android không cung cấp lập chỉ mục XML trực tiếp cho các mảng dựa trên xml.


1
@ Stewiko99 cảm ơn vì đã phát hiện ra lỗi, đã thay đổi nó cho phù hợp.
Amitesh

Đây là cách ngắn gọn nhất để làm điều đó. +1!
suomi35

1
điều này có vẻ ngắn gọn hơn nhưng nếu ai đó hoặc người dịch thay đổi thứ tự của mảng trong tệp chuỗi, cuối cùng bạn sẽ sử dụng chuỗi sai.
triển mới

9

Không may:

  • Có vẻ như bạn không thể tham chiếu một mục duy nhất từ ​​một mảng trong các giá trị / Arrayays.xml bằng XML. Tất nhiên bạn có thể bằng Java, nhưng không phải XML. Không có thông tin nào về việc làm như vậy trong tài liệu tham khảo dành cho nhà phát triển Android và tôi không thể tìm thấy bất kỳ nơi nào khác.

  • Có vẻ như bạn không thể sử dụng một mảng làm chìa khóa trong bố cục tùy chọn. Mỗi khóa phải là một giá trị duy nhất với tên khóa riêng của nó.

Những gì tôi muốn thực hiện: Tôi muốn có thể lặp qua 17 tùy chọn, kiểm tra xem mục đó có được kiểm tra hay không và nếu có, hãy tải chuỗi từ mảng chuỗi cho tên tùy chọn đó.

Đây là mã tôi đã hy vọng sẽ hoàn thành nhiệm vụ này:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());  
ArrayAdapter<String> itemsArrayList = new ArrayAdapter<String>(getBaseContext(),   android.R.layout.simple_list_item_1);  
String[] itemNames = getResources().getStringArray(R.array.itemNames_array);  


for (int i = 0; i < 16; i++) {  
    if (prefs.getBoolean("itemKey[i]", true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
} 

Tôi đã làm gì:

  • Tôi đặt một chuỗi đơn cho mỗi mục và tham chiếu các chuỗi đơn trong. Tôi sử dụng tham chiếu chuỗi đơn cho tiêu đề hộp kiểm bố trí tùy chọn và mảng cho vòng lặp của tôi.

  • Để lặp qua các tùy chọn, tôi chỉ đặt tên các khóa như key1, key2, key3, v.v. Vì bạn tham chiếu một khóa bằng một chuỗi, bạn có tùy chọn "xây dựng" tên khóa khi chạy.

Đây là mã mới:

for (int i = 0; i < 16; i++) {  
        if (prefs.getBoolean("itemKey" + String.valueOf(i), true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
}

1

Một cách khác để làm điều đó là xác định một mảng tài nguyên trong chuỗi DOM như bên dưới.

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [
    <!ENTITY supportDefaultSelection "Choose your issue">
    <!ENTITY issueOption1 "Support">
    <!ENTITY issueOption2 "Feedback">
    <!ENTITY issueOption3 "Help">
    ]>

và sau đó xác định một mảng chuỗi bằng cách sử dụng các tài nguyên trên

<string-array name="support_issues_array">
        <item>&supportDefaultSelection;</item>
        <item>&issueOption1;</item>
        <item>&issueOption2;</item>
        <item>&issueOption3;</item>
    </string-array>

Bạn có thể giới thiệu cùng một chuỗi vào các xml khác để giữ DRY nguyên vẹn. Ưu điểm tôi thấy là, với một thay đổi giá trị duy nhất, nó sẽ ảnh hưởng đến tất cả các tham chiếu trong mã.

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.