অ্যান্ড্রয়েড এক্সএমএল পার্সেন্ট সিম্বল


309

আমার কাছে স্ট্রিংগুলির একটি অ্যারে রয়েছে যাতে %প্রতীকটি ব্যবহৃত হয়। ব্যবহারের জন্য সঠিক বিন্যাস% হল %। যখন একাধিকের সাথে %আমার অ্যারেতে স্ট্রিং থাকে তখন এটি আমাকে এই ত্রুটি দেয়।

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected

6
আপনি কি এক্সএমএল পোস্ট করতে পারেন যা এই ত্রুটি ঘটাচ্ছে? কোনও সমস্যার কারণ না দেখে এটি সনাক্ত করা খুব কঠিন হতে পারে।
ক্রিস ক্যাশওয়েল

এটি এমন একটি ত্রুটি যা 2 বা ততোধিক% চিহ্ন সহ কোনও স্ট্রিং দ্বারা সহজেই প্রতিলিপি করা যায়।
জেড

যদি বিন্যাসের উদ্দেশ্যটি না খুঁজছেন তবে আরও ভাল উপায়ে সম্পন্ন করুন।
শিশির গুপ্ত

আমার ক্ষেত্রে, আমি ভুলভাবে% 1 $ s এর পরিবর্তে 1% as s হিসাবে ফর্ম্যাটিং প্যারামটি প্রবেশ করেছি।
অশোকচক্রবর্তী নাগারাজন

উত্তর:


467

অ্যান্ড্রয়েড অ্যাসেট প্যাকেজিং সরঞ্জাম ( aapt) তার সর্বশেষ প্রকাশে খুব কঠোর হয়ে উঠেছে এবং এখন সমস্ত অ্যান্ড্রয়েড সংস্করণে ব্যবহৃত হয় । আপনি যে অ্যাপট-ত্রুটিটি পেয়েছেন তা উত্পন্ন হয়েছে কারণ এটি আর অবস্থানহীন বিন্যাস নির্দিষ্টকরণের অনুমতি দেয় না

আপনি কীভাবে আপনার সংস্থানগুলিতে%-সিম্বল অন্তর্ভুক্ত করতে পারেন তা এখানে কয়েকটি ধারণা are

আপনার স্ট্রিংয়ে যদি কোনও ফর্ম্যাট স্পেসিফায়ার বা বিকল্পের প্রয়োজন না হয় আপনি কেবল formattedগুনটি ব্যবহার করতে পারেন এবং এটিকে সেট করতে পারেন false:

<string formatted="false">%a + %a == 2%a</string>

এই ক্ষেত্রে স্ট্রিংটি বিন্যাসের স্ট্রিং হিসাবে ব্যবহৃত হয় না Formatter সুতরাং আপনাকে আপনার%-চিহ্নগুলি থেকে বাঁচতে হবে না। ফলাফলযুক্ত স্ট্রিংটি "% a +% a == 2% a"।

আপনি যদি formatted="false"বৈশিষ্ট্যটি বাদ দেন তবে স্ট্রিংটি ফর্ম্যাট স্ট্রিং হিসাবে ব্যবহৃত হয় এবং আপনাকে%-চিহ্নগুলি থেকে বাঁচতে হবে। এটি ডাবল-% দিয়ে সঠিকভাবে করা হয়েছে:

<string>%%a + %%a == 2%%a</string>

এখন aaptআপনাকে কোনও ত্রুটি দেয় না তবে আপনি কীভাবে এটি ব্যবহার করেন তার উপর নির্ভর করে ফলাফলের স্ট্রিংটি যদি Formatterকোনও বিন্যাসের আর্গুমেন্ট ছাড়াই আহ্বান করা হয় তবে "%% a + %% a == 2 %% a" হতে পারে :

Resources res = context.getResources();

String s1 = res.getString(R.string.str);
// s1 == "%%a + %%a == 2%%a"

String s2 = res.getString(R.string.str, null);
// s2 == "%a + %a == 2%a"

কোনও এক্সএমএল এবং কোড ছাড়া আপনার সমস্যাটি ঠিক কী তা বলা মুশকিল তবে আশা করি এটি আপনাকে প্রক্রিয়াগুলি আরও ভালভাবে বুঝতে সহায়তা করে।


1
আমি এটিকে উত্তর হিসাবে বেছে নিয়েছি কারণ এটির কাজ করা উচিত, তবে স্পষ্টতই একটি বাগ রয়েছে যা আমি সেই স্ট্রিংটির সাথে চলেছি, তাই ive সিদ্ধান্ত নিয়েছিল %% এবং "XXX.replaceAll (" %% ","% ") ব্যবহার করার;"
জয়ড

4
বিন্যাসিত = মিথ্যা কাজ সুন্দরভাবে ব্যবহার করা । এইভাবে আমি এটি ব্যবহার করেছি: <স্ট্রিং নাম = "তথ্য_সংশ্লিষ্ট" বিন্যাসিত = "মিথ্যা"> Swe 'মিষ্টি \' ওজনে 10% থেকে 20% এমনকি 35% চিনি </ স্ট্রিং>
কোথাও কোথাও

1
ফর্ম্যাটেড = মিথ্যা আমার পক্ষেও খুব ভাল কাজ করে। %% ব্যবহার করে, এটি আক্ষরিকভাবে আমার ডিভাইস এবং এমুলেটরটিতে %% হিসাবে প্রদর্শিত হয়েছিল ..
সাম্যাইজ করুন

ফর্ম্যাট করা = মিথ্যা অতীতে আমার পক্ষে কাজ করেছিল worked এখন (এডিটি 22), কোনও কারণে তা হয় না। এবং যদি আমি ব্যবহার করি: "str = mContext.getString (R.string.str," হ্যালো ")", এটিতে এই লিন্টের সতর্কতা থাকবে: "বিন্যাস স্ট্রিং 'str' একটি বৈধ বিন্যাসের স্ট্রিং নয় তাই এটি পাস করা উচিত নয় it স্ট্রিং.ফর্ম্যাট "
অ্যান্ড্রয়েড বিকাশকারী

1
আপনি যদি <স্ট্রিং-অ্যারে /> থেকে অ্যাক্সেস করছেন তবে মুদ্রণের জন্য শতাংশ ব্যবহার করুন 00 u0025। এটি আমার পক্ষে কাজ করেছে।
চিন্তন শাহ

157

সংস্থান থেকে ফর্ম্যাট করা স্ট্রিং ব্যবহার করে অ্যাপ্লিকেশনটিকে মঞ্জুরি দেওয়ার জন্য আপনার উচিত আপনার এক্সএমএল সংশোধন করা। সুতরাং, উদাহরণস্বরূপ

<string name="app_name">Your App name, ver.%d</string>

সঙ্গে প্রতিস্থাপন করা উচিত

<string name="app_name">Your App name, ver.%1$d</string>

আপনি দেখতে পারেন এই বিস্তারিত জানার জন্য।


2
ধন্যবাদ, আপনি অনুপস্থিত লিঙ্কটি প্রদান করেছেন - আক্ষরিক অর্থে।
আকৌপ্পি

22
একাধিক প্যারামিটার প্রতিকল্পন (স্ট্রিং সঙ্গে যেমন), ব্যবহারের জন্য %1$s, %2$sইত্যাদি
CJBS

1
এই ছোট্ট কাজটির জন্য এত বড় উত্তর পড়বে কে? ধন্যবাদ, আমি আপনাকে সন্ধান করতে নিচে স্ক্রোল।
জনক আর রাজাপক্ষ

73

আপনি এক্সএমএল পার্সারের জন্য %% ব্যবহার করে% পালাতে পারেন, তবে এটি ডিভাইসে দু'বার প্রদর্শিত হয়েছে।

এটি একবার দেখাতে নিম্নলিখিত ফর্ম্যাটটি ব্যবহার করে দেখুন: \%%

উদাহরণ স্বরূপ

<string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

Fat Burning (50% to 60%)ডিভাইস হিসাবে প্রদর্শিত হয়


6
x %% নেক্সাস 4 4.2.1 এ ক্র্যাশ ঘটায়। অন্যকে পরীক্ষা করেনি।
জন উইলিস

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

এটি আমার জন্যও নেক্সাস 5.1.1 এ ক্র্যাশ হয়েছিল। @ উইলিউসকে উত্তরটি সঠিক।
চ্যান জিং হংক

2
সবেমাত্র% এর পরিবর্তে %% ব্যবহার করুন
সুন্দীপ 1501

36

ব্যবহার

<string name="win_percentage">%d%% wins</string>

পেতে

80% wins একটি ফর্ম্যাট স্ট্রিং হিসাবে।

আমি String.format()নম্বরটি পরিবর্তে getোকানোর জন্য পদ্ধতিটি ব্যবহার করছি %d


12

আপনার স্ট্রিং.এক্সএমএল ফাইলে আপনি যে কোনও ইউনিকোড সাইন ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, শতাংশ চিহ্নের জন্য ইউনিকোড নম্বর 0025:

<string name="percent_sign">&#x0025;</string>

আপনি এখানে ইউনিকোড লক্ষণগুলির একটি বিস্তৃত তালিকা দেখতে পাচ্ছেন


1
এটার কোন মানে নেই. & # x0025; এবং% xML ফাইলে অভিন্ন।
বেনিবেলা

রিসোর্স ফাইলটি জাভা রিসোর্সে রূপান্তরিত হয় এবং এর ফলে %অক্ষরটি ফিরে আসে। আমি আশঙ্কা করছি এটি সমস্যার সমাধান করে না।
পল ল্যামার্টসমা

9

শতাংশ প্রতীক এড়াতে আপনার প্রয়োজন মাত্র %%

উদাহরণ স্বরূপ :

String.format("%1$d%%", 10)

"10%" প্রদান করে


1
আপনার উত্তরটি বেশ কয়েকটি অন্যান্য বিদ্যমান উত্তরের মতো একই
বেন রাইস-লুইস

... এবং ভুল, কারণ ফিরে আসে 10%না %10। এফআইওয়াই: আপনি যখন ব্যবহার করবেন তখন প্রতিবার লোকাল String.formatনির্দিষ্ট করা উচিত। আপনি যখন লোকেলটি রাখেন না এবং ফর্ম্যাট সংখ্যার জন্য আরবি লোকেল ব্যবহার করেন না তখন আপনি সত্যিই অবাক হয়ে যেতে পারেন ...
এমট্রাকাল

7

হুবহু আপনার সমস্যা নয় তবে একটি অনুরূপ।

আপনার স্ট্রিং এন্ট্রিতে যদি একাধিক ফর্ম্যাটিং থাকে তবে আপনার "% s" একাধিকবার ব্যবহার করা উচিত নয়।

করবেন না:

<string name="entry">Planned time %s - %s (%s)</string>

করুন:

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>

5

আপনি %% সহ xML এ% পালাতে পারেন, তবে আপনাকে পাঠ্য কোডে সেট করতে হবে, লেআউট xML- এ নয়।


1
হ্যাঁ এটি ডাবল% দিয়ে পালাতে পারে এবং সুন্দরভাবে সংকলন করে। তবে এমুলেটর বা এমনকি ডিভাইসগুলিতে চালিত হওয়ার সময় এটি %% হিসাবে দেখাতে পারে।
সমেয় করুন

5

এটি আইডিই খুব কড়া হয়ে যাওয়ার ঘটনা হতে পারে।

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

প্রথমত, একটি স্ট্রিং যেমন:

You will need %.5G %s

হিসাবে আপনি ব্যবহার করতে হবে 2.1200 মিলিগ্রাম প্রয়োজন যে কোনও ভাষাতে ক্রম একই থাকবে যেমন পরিমাণে সর্বদা সেই পরিমাণে বৈজ্ঞানিকভাবে প্রতিনিধিত্ব করা হয়।

দ্বিতীয়টি হ'ল যদি আপনি আপনার ডিফল্ট সংস্থানসমূহে (যেমন ইংরাজী) নির্দিষ্ট কোন ভাষাতে ভেরিয়েবলের ক্রম রাখেন তবে আপনার কেবলমাত্র ভাষাগুলির জন্য উত্সের স্ট্রিংগুলিতে অবস্থানগুলি নির্দিষ্ট করতে হবে আপনার ডিফল্ট ভাষায় আলাদা অর্ডার ব্যবহার করতে হবে।

সুসংবাদটি হ'ল এটি ঠিক করা সহজ। যদিও পজিশন নির্দিষ্ট করার প্রয়োজন নেই এবং আইডিই অতিরিক্ত কঠোর হচ্ছে তবে যেভাবেই হোক সেগুলি নির্দিষ্ট করুন। উপরে ব্যবহারের উদাহরণের জন্য:

আপনার প্রয়োজন হবে% 1 $ .5G% 2 $ s



3

এটি চেষ্টা করুন (ডান):

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>


-1

মনে করুন আপনি রানটাইমটিতে (50% অফ) দেখাতে এবং 50 টি প্রবেশ করতে চান। কোডটি এখানে:

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

জাভা শ্রেণিতে এই কোডটি ব্যবহার করুন:

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);

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