এক্সএমএল দিয়ে স্ট্রিং অ্যারে রিসোর্সে স্ট্রিংকে উল্লেখ করা হচ্ছে


256

আমার পছন্দ আছে যেখানে আপনি মেনুতে কী আইটেম প্রদর্শিত হবে তা সক্ষম / অক্ষম করতে পারবেন। 17 টি আইটেম আছে। আমি এই 17 টি আইটেমের প্রত্যেকের শিরোনাম সহ মান / অ্যারে.এক্সএমএল এ স্ট্রিং অ্যারে তৈরি করেছি।

আমার পছন্দের ফাইলগুলির জন্য লেআউট রয়েছে এমন পছন্দসই.এক্সএমএল আছে এবং আমি শিরোনাম হিসাবে ব্যবহার করতে স্ট্রিং অ্যারে থেকে একটি আইটেমটি উল্লেখ করতে চাই।

কিভাবে আমি এটি করতে পারব?

অ্যান্ড্রয়েড বিকাশকারী রেফারেন্সে, আমি দেখতে পাচ্ছি যে কীভাবে আমি এক্সএমএলের সাথে একটি একক স্ট্রিংয়ের রেফারেন্স করতে পারি, তবে কীভাবে এক্সএমএল-এ অ্যারে রিসোর্স থেকে কোনও স্ট্রিংটিকে রেফারেন্স করতে পারি তা নয়।

উত্তর:


331

সংক্ষেপে বলতে গেলে: আমি মনে করি না আপনি যা করতে পারেন, কিন্তু একটি ওয়ার্কঅ্যারাউন্ড মনে করা হয়:

আপনি যদি এখানে অ্যান্ড্রয়েড রিসোর্সটি একবার দেখে থাকেন:

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

আপনি অ্যারে বিভাগের (স্ট্রিং অ্যারে, কমপক্ষে) এর অধীনে দেখেন যে "রিসোর্স রেফারেন্স" (আপনি একটি এক্সএমএল থেকে পেয়েছেন) স্বতন্ত্র আইটেমগুলিকে সম্বোধনের কোনও উপায় নির্দিষ্ট করে না। এমনকি আপনি "@ অ্যারে / ইউরারেরে" ব্যবহার করতে আপনার এক্সএমএলে চেষ্টা করতে পারেন। আমি জানি যে ডিজাইনের সময় আপনি প্রথম আইটেমটি পাবেন। আপনি যদি ব্যবহার করতে চান তবে এটি ব্যবহারিক ব্যবহারের নয়, আসুন অবশ্যই বলা যাক ... দ্বিতীয়, অবশ্যই।

তবুও, একটি কৌশল আছে যা আপনি করতে পারেন। এখানে দেখো:

এক্সএমএল অ্যারেতে একটি এক্সএমএল স্ট্রিং উল্লেখ করা (অ্যান্ড্রয়েড)

আপনি অ্যারে সংজ্ঞাটি স্বতন্ত্র স্ট্রিংগুলিতে সম্বোধন করে অ্যারে সংজ্ঞাটি "প্রতারণা" করতে (সত্যই নয়) পারেন can উদাহরণস্বরূপ, আপনার স্ট্রিং.এক্সএমএল এ:

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

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

এটি ব্যবহার করে, আপনি আপনার "অ্যান্ড্রয়েড: পাঠ্য" এবং "অ্যান্ড্রয়েড: শিরোনাম" এক্সএমএল ক্ষেত্রগুলিতে সাধারণত "@ স্ট্রিং / আর্থ" এবং "@ স্ট্রিং / মুন" ব্যবহার করতে পারেন তবে আপনি অ্যারে ব্যবহারের ক্ষমতা হারাবেন না আপনি প্রথম স্থানে যা কিছু উদ্দেশ্যে চেয়েছিলেন তার সংজ্ঞা।

আমার গ্রহণের কাজটি এখানে মনে হচ্ছে। আপনি চেষ্টা করে আমাদের কাজ করেন কিনা তা বলছেন না কেন? :-)


32
যদি আমরা কেবল name<item> s ... * দীর্ঘশ্বাস *
কিছু নুব শিক্ষার্থী

2
শুধু চেষ্টা করে দেখলাম! অ্যারেটি ডিফল্টরূপে সংজ্ঞায়িত করে strings.xmlকিন্তু এতে নেই values-frএবং ফরাসি সংস্করণ সহ অ্যারেটি এখনও আপডেট হয়। তাই ভুল .. তবে এটি কাজ করে!
ব্লুন্ডেল

1
কারও কাছে দ্রুত পরামর্শ: "পৃথিবীতে" ডাবল ক্লিক করা পৃথিবীকে হাইলাইট করবে। @ স্ট্রিং / চাঁদে চাঁদে ডাবল ক্লিক করা কেবলমাত্র চাঁদে হাইলাইট করবে। সুতরাং, আপনি যদি আপনার অ্যারে তৈরি করার সময় প্রথম আইটেমটি বেশ কয়েকবার নকল করেন, তবে আপনি নিজের স্বতন্ত্র স্ট্রিং এবং স্ট্রিং-অ্যারের মধ্যে মোটামুটি অনুলিপি করে কপি করতে পারেন। আপনার স্ট্রিং-অ্যারে তৈরির গতি বাড়ানোর সাথে সাহায্য করতে পারে :)
আর্টঅফ ওয়ারফেয়ার

2
কেবলমাত্র জানতে চাই যে এই পদ্ধতির কারণে আমি যদি অ্যারেগুলিতে স্ট্রিংগুলি ঘোষণা করি তবে তারা রেফারেন্স ব্যবহার করছে না তার চেয়ে খারাপ পারফরম্যান্স ঘটায়?
অ্যালেক্স বনেল

1
@ অ্যালেক্সবোনেল একটি আকর্ষণীয় প্রশ্ন, এবং আমি সত্যই জানি না। এমনকি যদি এটি হয় তবে আমি মনে করি আমাদের এই ধরণের খুব মাইক্রো অপ্টিমাইজেশনটি সংকলকটিতে ছেড়ে দেওয়া উচিত। যাইহোক, তারা রাস্তায় কোথাও linedুকে শেষ হয় না? আমি তাদের অনুমান করতে পারি, তবে আমি নিশ্চিত নই। কমপক্ষে অ্যান্ড্রয়েড চেইনে উচ্চতর স্তরে, আমি জানি যে আপনি এপিটকোলের সাহায্যে একটি এপিকে সম্পূর্ণরূপে বিচ্ছিন্ন করতে পারেন এবং এটি স্ট্রিং কীগুলির মূল নামগুলি পুনরুদ্ধার করবে, যার অর্থ রেফারেন্সযুক্ত ঘোষণাগুলি যেমন উপরের মতো রাখা হয়েছে। তবে আমি এখনই সেই অঞ্চলে খুব বেশি আগ্রহী নই, সুতরাং আমি আপনার প্রশ্নের উত্তর দিতে পারব না। যদিও এটি একটি ভাল প্রশ্ন।
ডেভিডসিএসবি

216

হতে পারে এটি সাহায্য করবে:

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

সুতরাং আপনি স্ট্রিং হিসাবে অ্যারে-তালিকাটি পান [] এবং তারপরে যেকোনও i, some_array [i] চয়ন করুন।


10
অ্যারে সংস্থান কীভাবে পাবেন তা আমি বুঝতে পারি I এটি আমাকে যদিও এক্সএমএল লেআউটে অ্যারে থেকে আইটেমটি উল্লেখ করতে দেয় না allow
জোর্শার

1
ওহ দুঃখিত. আমি ভুল বুঝেছিলাম. ঠিক আছে, এটি কি এক্সএমএল লেআউটে থাকতে হবে? যদি ব্যবহারকারী নির্বাচনের সাথে শিরোনাম পরিবর্তিত হয়, তবে এটি কেবল জাভা ফাইলেই করবেন না। উদা। সেটটেক্সট (কিছু_আরে [i])।

2
কারণ, পছন্দসমূহের বিন্যাসটি এক্সএমএল-তে রয়েছে। জাভা পছন্দগুলিতে "সক্ষম" থাকা আইটেমগুলির সাথে মেনুটি লোড করে। অগ্রাধিকারের জন্য 17 টি চেক টাইপ করা, এবং পরবর্তী কোডটি এটিকে তালিকার ভিউতে যুক্ত করার জন্য আমার কাছে কেবল অপ্রয়োজনীয় এবং আড়ম্বরপূর্ণ বলে মনে হচ্ছে।
জোর্শার

আমি যখন আমার মান ফোল্ডারে একটি এক্সএমএল অ্যারে থেকে একটি অ্যারেআইডাপ্টার তৈরি করছিলাম তখন এটি দরকারী ছিল
EHarpham

অগ্রাধিকার পাওয়ার সময় যখন একটি ডিফল্ট মান প্রয়োজন হয় তখন আমি এই String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);দরকারীটি পেয়েছি : যেখানে আমার_প্রিফ আগে কিছু মান সেট করা হয়েছিল কিছু_রে (x]
আল লেলোপাথ

67

আরও ভাল বিকল্পটি কেবলমাত্র উত্স হিসাবে প্রাপ্ত অ্যারেটিকে অ্যারে হিসাবে ব্যবহার করা হবে যার অর্থ:

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

এটি উপরে উল্লিখিত পদ্ধতির একটি শর্টকাট পদ্ধতি কিন্তু আপনার পছন্দ মতো ফ্যাশনে কাজ করে। অন্যথায় অ্যান্ড্রয়েড এক্সএমএল ভিত্তিক অ্যারেগুলির জন্য সরাসরি এক্সএমএল সূচক সরবরাহ করে না।


1
@ বেনজিকো 99 ত্রুটিটি চিহ্নিত করার জন্য ধন্যবাদ, সে অনুযায়ী এটি পরিবর্তন করেছেন।
অমিতেশ

এটি করার জন্য এটি সবচেয়ে সংক্ষিপ্ত উপায়। +1 টি!
suomi35

1
এটি আরও সংক্ষিপ্ত বলে মনে হতে পারে তবে যদি কেউ বা অনুবাদক স্ট্রিং ফাইলটিতে অ্যারের ক্রম পরিবর্তন করে তবে আপনি ভুল স্ট্রিংটি ব্যবহার করে শেষ করবেন।
ডেভলপার 23

9

দুর্ভাগ্যবশত:

  • দেখে মনে হচ্ছে আপনি XML সহ মান / অ্যারে.এক্সএমএল থেকে অ্যারে থেকে একটি আইটেমটি উল্লেখ করতে পারবেন না। অবশ্যই আপনি জাভাতে পারেন, তবে এক্সএমএল নয়। অ্যান্ড্রয়েড বিকাশকারী রেফারেন্সে এটি করার কোনও তথ্য নেই এবং আমি অন্য কোথাও খুঁজে পাইনি।

  • দেখে মনে হচ্ছে আপনি পছন্দ বিন্যাসে একটি অ্যারে কী হিসাবে ব্যবহার করতে পারবেন না। প্রতিটি কী এর নিজস্ব কী নাম সহ একক মান হওয়া উচিত।

আমি কী সম্পাদন করতে চাই: আমি 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]);  
    }  
} 

আমি কি করেছিলাম:

  • আমি প্রতিটি আইটেমের জন্য একটি একক স্ট্রিং সেট করেছি, এবং এর মধ্যে একক স্ট্রিংগুলি উল্লেখ করেছি। আমি পছন্দসই লেআউট চেকবক্স শিরোনামগুলির জন্য একক স্ট্রিং রেফারেন্স এবং আমার লুপের জন্য অ্যারে ব্যবহার করি।

  • পছন্দগুলি লুপ করার জন্য, আমি কী -1, কী 2, কী 3 ইত্যাদির মতো কীগুলি নামকরণ করেছি, আপনি যেহেতু একটি স্ট্রিং সহ একটি কী উল্লেখ করেছেন, তাই রানটাইমটিতে আপনার কী কী নামটি "বিল্ড" করার বিকল্প রয়েছে।

নতুন কোডটি এখানে:

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

1

এটি করার আরেকটি উপায় নীচের মতো স্ট্রিং.এক্সএমএলে একটি সংস্থার অ্যারের সংজ্ঞা দেওয়া।

<?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>

আপনি একই স্ট্রিংটিকে ডিআরওয়াই অক্ষত রেখে অন্য এক্সএমএলসে উল্লেখ করতে পারেন। আমি যে সুবিধাটি দেখছি তা হ'ল একক মান পরিবর্তনের সাথে এটি কোডের সমস্ত রেফারেন্সকে প্রভাবিত করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.