การอ้างอิงสตริงในรีซอร์สอาร์เรย์ของสตริงด้วย xml


256

ฉันมีการตั้งค่าที่คุณสามารถเปิด / ปิดการใช้งานรายการที่จะปรากฏบนเมนู มี 17 รายการ ฉันสร้างอาร์เรย์สตริงในค่า / arrays.xml ด้วยหัวเรื่องสำหรับแต่ละรายการ 17 รายการ

ฉันมี preferences.xml ซึ่งมีเลย์เอาต์สำหรับไฟล์การตั้งค่าของฉันและฉันต้องการอ้างอิงรายการเดียวจากอาเรย์สตริงเพื่อใช้เป็นชื่อเรื่อง

ฉันจะทำสิ่งนี้ได้อย่างไร

ในการอ้างอิงนักพัฒนาซอฟต์แวร์ Android ฉันเห็นว่าฉันสามารถอ้างอิงสตริงเดี่ยวด้วย XML ได้อย่างไร แต่ไม่ใช่ว่าฉันจะอ้างอิงสตริงจากทรัพยากรอาร์เรย์ใน XML ได้อย่างไร

คำตอบ:


331

ในระยะสั้น: ผมไม่คิดว่าคุณสามารถ แต่ดูเหมือนว่าจะมีวิธีแก้ปัญหา:

หากคุณพิจารณาทรัพยากร Android ที่นี่:

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

คุณเห็นมากกว่าในส่วนอาเรย์ (อาเรย์อย่างน้อยสตริง) "อ้างอิงทรัพยากร" (เมื่อคุณได้รับจาก XML) ไม่ได้ระบุวิธีการจัดการกับไอเท็มแต่ละรายการ คุณสามารถลองใน XML เพื่อใช้ "@ array / yourarrayhere" ฉันรู้ว่าในเวลาออกแบบคุณจะได้รับสินค้าชิ้นแรก แต่นั่นไม่ใช่การใช้งานจริงหากคุณต้องการใช้สมมุติว่า ... อย่างที่สองแน่นอน

อย่างไรก็ตามมีเคล็ดลับที่คุณสามารถทำได้ ดูที่นี่:

การอ้างอิงสตริง XML ใน XML Array (Android)

คุณสามารถ "โกง" (ไม่ได้จริงๆ) นิยามอาร์เรย์โดยการกำหนดสตริงอิสระภายในนิยามของอาร์เรย์ ตัวอย่างเช่นใน strings.xml ของคุณ:

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

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

โดยใช้สิ่งนี้คุณสามารถใช้ "@ string / earth" และ "@ string / moon" ตามปกติในฟิลด์ "android: text" และ "android: text" ของคุณและคุณจะไม่สูญเสียความสามารถในการใช้อาร์เรย์ คำจำกัดความสำหรับวัตถุประสงค์ใด ๆ ก็ตามที่คุณตั้งใจไว้ตั้งแต่แรก

ดูเหมือนว่าจะทำงานที่นี่กับ Eclipse ของฉัน ทำไมคุณไม่ลองและบอกเราถ้ามันใช้งานได้? :-)


32
ถ้าเราสามารถให้nameแท็กกับ <item> s ... * ถอนหายใจ *
นักศึกษา Noob บางคน

2
ลองเลย! กำหนดอาร์เรย์เป็นค่าเริ่มต้นstrings.xmlแต่ไม่ได้อยู่ในนั้นvalues-frและอาร์เรย์ยังคงได้รับการปรับปรุงด้วยรุ่นภาษาฝรั่งเศส ผิดไปเลย .. แต่มันก็ใช้ได้ดี!
Blundell

1
เคล็ดลับด่วนสำหรับทุกคน: การคลิกสองครั้งที่ "Earth" จะเน้นสี Earth การคลิกสองครั้งที่ดวงจันทร์ใน @ string / moon จะเป็นการเน้นเพียงดวงจันทร์ ดังนั้นหากคุณทำซ้ำไอเท็มแรกหลาย ๆ ครั้งเมื่อสร้างอาเรย์ของคุณคุณสามารถคัดลอกและวางระหว่างสตริงแต่ละอันกับอาเรย์สตริงของคุณได้อย่างง่ายดาย อาจช่วยเร่งการสร้างสตริงอาเรย์ของคุณให้เร็วขึ้น :)
ArtOfWarfare

2
เพียงแค่ต้องการทราบว่าวิธีการนี้ทำให้ประสิทธิภาพแย่ลงกว่าถ้าฉันประกาศสตริงในอาร์เรย์ตามที่พวกเขา แต่ไม่ได้ใช้อ้างอิง?
Alex Bonel

1
@AlexBonel คำถามที่น่าสนใจและฉันก็ไม่รู้เหมือนกัน แม้ว่าจะเป็นเช่นนั้นฉันคิดว่าเราควรปล่อยให้การเพิ่มประสิทธิภาพขนาดเล็กมาก ๆ เข้ากับคอมไพเลอร์ ยังไงก็ตามพวกเขาไม่ได้อยู่ที่ถนนหรือไม่? ฉันเดาว่าพวกเขาทำ แต่ฉันไม่แน่ใจ อย่างน้อยในระดับที่สูงขึ้นในสายโซ่ Android ฉันรู้ว่าคุณสามารถแยก APK อย่างเต็มรูปแบบด้วย apktool และมันจะกู้คืนชื่อดั้งเดิมของคีย์สตริงซึ่งแปลว่าการอ้างอิงที่อ้างอิงเช่นเดียวกับที่กล่าวข้างต้น แต่ตอนนี้ฉันไม่สนใจเรื่องนั้นมากนักดังนั้นฉันจึงไม่สามารถตอบคำถามของคุณได้ มันเป็นคำถามที่ดี
davidcsb

216

บางทีนี่อาจช่วย:

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

ดังนั้นคุณจะได้รับ array-list เป็น String [] จากนั้นเลือก i ใด ๆ some_array [i]


10
ฉันเข้าใจวิธีรับทรัพยากรอาเรย์ ไม่อนุญาตให้ฉันอ้างอิงรายการจากอาร์เรย์ในโครงร่าง xml
Jorsher

1
ขอโทษด้วย ฉันเข้าใจผิด. มันต้องอยู่ในเลย์เอาต์ xml หรือไม่? หากชื่อมีการเปลี่ยนแปลงด้วยตัวเลือกของผู้ใช้ทำไมไม่ทำในไฟล์. java เช่น. setText (some_array [i])

2
เนื่องจากโครงร่างการกำหนดค่าตามความชอบอยู่ใน xml java โหลดเมนูด้วยไอเท็มที่ "เปิดใช้งาน" ในการกำหนดค่าตามความชอบ การพิมพ์การตรวจสอบค่ากำหนด 17 รายการและรหัสถัดไปเพื่อเพิ่มลงใน listview ดูเหมือนว่าซ้ำซ้อนและเลอะเทอะมาก
Jorsher

สิ่งนี้มีประโยชน์เมื่อฉันสร้าง arrayadapter จากอาร์เรย์ xml ในโฟลเดอร์ค่าของฉัน
EHarpham

ฉันพบว่ามีประโยชน์เมื่อต้องการค่าเริ่มต้นเมื่อได้รับการกำหนดค่าตามความชอบ: String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);ที่ซึ่ง my_pref ถูกตั้งค่าก่อนหน้านี้เป็นค่าบางค่า some_array [x]
Al Lelopath

67

ตัวเลือกที่ดีกว่าคือการใช้ทรัพยากรที่ส่งคืนอาเรย์เป็นอาร์เรย์ความหมาย:

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

นี่เป็นวิธีลัดของวิธีที่กล่าวมาข้างต้น แต่ทำงานในแบบที่คุณต้องการ มิฉะนั้น android ไม่ได้จัดทำดัชนี XML โดยตรงสำหรับอาร์เรย์ที่ใช้ xml


1
@ Benjiko99 ขอบคุณที่จำข้อผิดพลาดได้เปลี่ยนไป
Amitesh

นี่เป็นวิธีที่รัดกุมที่สุดในการทำ +1!
suomi35

1
สิ่งนี้อาจดูเหมือนรัดกุมกว่า แต่ถ้ามีคนหรือผู้แปลเปลี่ยนลำดับของอาร์เรย์ในไฟล์สตริงคุณจะต้องใช้สตริงที่ไม่ถูกต้อง
พัฒนาใหม่

9

น่าเสียดาย:

  • ดูเหมือนว่าคุณไม่สามารถอ้างอิงรายการเดียวจากอาร์เรย์ในค่า / arrays.xml ด้วย XML แน่นอนคุณสามารถทำได้ใน Java แต่ไม่ใช่ XML ไม่มีข้อมูลเกี่ยวกับการทำเช่นนั้นในการอ้างอิงนักพัฒนา Android และฉันไม่สามารถหาที่อื่นได้

  • ดูเหมือนว่าคุณไม่สามารถใช้อาร์เรย์เป็นคีย์ในโครงร่างการกำหนดค่าตามความชอบ แต่ละคีย์ต้องเป็นค่าเดียวโดยมีชื่อคีย์เป็นของตัวเอง

สิ่งที่ฉันต้องการทำให้สำเร็จ: ฉันต้องการให้สามารถวนลูปผ่านการกำหนดลักษณะ 17 รายการตรวจสอบว่ามีการตรวจสอบรายการแล้วหรือไม่และโหลดสตริงจากอาร์เรย์สตริงสำหรับชื่อการกำหนดค่านั้นหรือไม่

นี่คือรหัสที่ฉันหวังว่าจะทำงานนี้ให้เสร็จ:

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]);  
    }  
} 

ฉันทำอะไรลงไป:

  • ฉันตั้งค่าสายเดียวสำหรับแต่ละรายการและอ้างอิงสายเดียวใน ฉันใช้การอ้างอิงสตริงเดี่ยวสำหรับชื่อช่องทำเครื่องหมายการกำหนดค่าตามความชอบและอาร์เรย์สำหรับลูปของฉัน

  • ในการวนซ้ำการตั้งค่าฉันเพิ่งตั้งชื่อคีย์เช่น key1, key2, key3 เป็นต้นเนื่องจากคุณอ้างอิงคีย์ด้วยสตริงคุณจึงมีตัวเลือกเพื่อ "สร้าง" ชื่อคีย์เมื่อรันไทม์

นี่คือรหัสใหม่:

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

1

อีกวิธีในการทำคือการกำหนดอาร์เรย์ทรัพยากรใน strings.xml เช่นด้านล่าง

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

แล้วกำหนดอาร์เรย์สตริงโดยใช้ทรัพยากรข้างต้น

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

คุณสามารถอ้างถึงสายอักขระเดียวกันใน xml อื่น ๆ ซึ่งทำให้ DRY ไม่เสียหาย ข้อได้เปรียบที่ฉันเห็นคือการเปลี่ยนแปลงเพียงค่าเดียวจะส่งผลต่อการอ้างอิงทั้งหมดในรหัส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.