অ্যান্ড্রয়েড টেক্সটভিউ: "সেটটেক্সটের সাহায্যে প্রদর্শিত পাঠ্যকে একত্রিত করবেন না"


136

আমি নিম্নলিখিত পদ্ধতিতে সেটটেক্সট () ব্যবহার করে পাঠ্য সেট করছি ।

prodNameView.setText("" + name);

prodOriginalPriceView.setText("" + String.format(getString(R.string.string_product_rate_with_ruppe_sign), "" + new BigDecimal(price).setScale(2, RoundingMode.UP)));

সেই প্রথমটিতে সাধারণ ব্যবহার এবং দ্বিতীয়টি বিন্যাসের পাঠ্য সহ পাঠ্য নির্ধারণ করছে।

অ্যান্ড্রয়েড স্টুডিওটি এত আকর্ষণীয়, আমি মেনু ব্যবহার করেছি Analyze -> Code Cleanupএবং আমার মত দুটি লাইনের উপরে পরামর্শ পেয়েছি।

এখানে চিত্র বর্ণনা লিখুন

সেটটেক্সট সহ প্রদর্শিত পাঠ্যকে একত্রিত করবেন না। স্থানধারীদের সাথে রিসোর্স স্ট্রিং ব্যবহার করুন। কম ... (Ctrl + F1)

পাঠ্যদর্শন # সেটটেক্সট কল করার সময় :

  • সংখ্যার ফর্ম্যাট করতে নাম্বারে # টুস্ট্রিং () কে কখনও কল করবেন না; এটি ভগ্নাংশ বিভাজক এবং লোকেল-নির্দিষ্ট অঙ্কগুলি সঠিকভাবে পরিচালনা করবে না। পরিবর্তে সঠিক বিন্যাসের স্পেসিফিকেশন (% d বা% f) দিয়ে স্ট্রিং # ফর্ম্যাটটি ব্যবহার করার বিষয়টি বিবেচনা করুন।
  • পাঠ্য প্রদর্শনের জন্য একটি স্ট্রিং আক্ষরিক (যেমন "হ্যালো") পাস করবেন না। হার্ডকোডযুক্ত পাঠ্যটি অন্য ভাষায় সঠিকভাবে অনুবাদ করা যায় না। পরিবর্তে অ্যান্ড্রয়েড রিসোর্স স্ট্রিং ব্যবহার বিবেচনা করুন।
  • পাঠ্য খণ্ডগুলি সহ্য করে বার্তা তৈরি করবেন না। এই জাতীয় বার্তাগুলি সঠিকভাবে অনুবাদ করা যায় না।

আমি এর জন্য কি করতে পারি? জিনিসটি কী তা বোঝাতে যে কেউ সহায়তা করতে পারে এবং আমার কী করা উচিত?


1
তার মানে আপনার কেবল একটি Stringপ্রবেশ করানো উচিত setText()। প্রাক্তন: setText(name)স্থির setText("" + name)। কারণ আপনি যদি পাঠ্যকে একত্রীকরণ করেন তবে এটি হার্ডকোডযুক্ত পাঠ্যটিকে বার্তাটি বিজ্ঞপ্তি হিসাবে ব্যবহার করার মতো অনুবাদ করা হবে না
মিঃ নিও

কিন্তু এটা দেব NPEযদি nameহয়NULL
প্রতীক Butani

চেক ফাংশন ব্যবহার করার আগে nameনয় । NULLsetText()
মিঃ নিও

2
আপনার কিছু স্ট্রিং রিসোর্সে স্থানধারক ব্যবহার না করে কিছু মান সহ স্ট্রিং রিসোর্সটি একত্রিত করা উচিত নয়। সুতরাং আপনার স্ট্রিং.এমএমএলে আপনি: <string name="string_product_rate_with_ruppe_sign">Something %1$d</string> এবং আপনার জাভা কোডে আপনি এর মতো কিছু করতে পারেন: prodOriginalPriceView.setText(getString(R.string.string_product_rate_with_ruppe_sign), price); (আপনি এক্সএমএল ফাইলে ফর্ম্যাট করতে পারেন: [ বিকাশকারী।
অ্যান্ড্রয়েড

উত্তর:


294

রিসোর্সে গেটস্ট্রিংয়ের ওভারলোডড সংস্করণ রয়েছে যা varargsএক ধরণের Object: গেটস্ট্রিং (ইন, জাভা.লং.অবজেক্ট ...) নেয় । আপনি যদি সঠিকভাবে স্থানধারীদের সাথে আপনার স্ট্রিংগুলি স্ট্রিংস.এক্সএমএলকে সঠিকভাবে সেটআপ করেন তবে আপনি আপনার চূড়ান্ত স্ট্রিংয়ের ফর্ম্যাট সংস্করণটি পুনরুদ্ধার করতে এই সংস্করণটি ব্যবহার করতে পারেন। যেমন

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

ব্যবহার getString(R.string.welcome_message, "Test", 0);

অ্যান্ড্রয়েড একটি স্ট্রিং এর সাথে ফিরে আসবে

 "Hello Test! you have 0 new messages"

সম্পর্কিত setText("" + name);

আপনার প্রথম উদাহরণ, prodNameView.setText("" + name);আমার কাছে কোনও ধারণা রাখে না। টেক্সটভিউ নাল মানগুলি পরিচালনা করতে সক্ষম। নামটি যদি নাল হয় তবে কোনও পাঠ্য আঁকবে না।


1
ধরে নিচ্ছি যে আপনার বিগডিসিমালে আপনি ফ্লোট মানটি কল করবেন: %1$fআপনার স্ট্রিংয়ে স্ট্রিং.এক্সএমএল যুক্ত করুন এবং তারপরে কল করুনsetText(getString(R.string.string_product_rate_with_ruppe_sign, new BigDecimal(price).setScale(2, RoundingMode.UP).floatValue() ));
ব্ল্যাকবেল্ট

এটি উত্তরের দ্বিতীয় অংশে রয়েছে। এক
নজরে

আমি একটি পূর্ণসংখ্যার দেখাতে চাই St স্ট্রিং স্ট্যান্ড $ গুলি এবং দশমিক $ d। তাহলে পূর্ণসংখ্যা দাঁড়ায়?
reegan29

যদি আপনি "স্থানধারক" বোঝাতে চান তবে আপনি ব্যবহার করতে পারেন %1$d। @ রিগ্যান29
ব্ল্যাকবেল্ট

3
যে কেউ
এআইপি-র

34

গৃহীত উত্তরে % 1 $ s এবং % 2 $ d এর সাথে বিভ্রান্ত হবেন না e এখানে কয়েকটি অতিরিক্ত তথ্য।

  • ফর্ম্যাট স্পেসিফায়ারগুলি নিম্নলিখিত সিনট্যাক্সের হতে পারে:

% [ argument_index$]format_specifier

  1. Alচ্ছিক আর্গুমেন্ট_ইন্ডেক্সটি "%" এর পরে "$" দিয়ে শেষ হওয়া সংখ্যা হিসাবে নির্দিষ্ট করা হয় এবং যুক্তি তালিকায় নির্দিষ্ট যুক্তি নির্বাচন করে। প্রথম যুক্তিটি "1 $" , দ্বিতীয়টি "2 $" ইত্যাদি দ্বারা উল্লেখ করা হয় etc.
  2. প্রয়োজনীয় ফর্ম্যাট স্পেসিফায়ার এমন একটি অক্ষর যা নির্দেশ করে যে কীভাবে আর্গুমেন্টটি ফর্ম্যাট করা উচিত। প্রদত্ত আর্গুমেন্টের জন্য বৈধ রূপান্তরগুলির সেটটি আর্গুমেন্টের ডেটা টাইপের উপর নির্ভর করে

উদাহরণ

আমরা নিম্নলিখিত ফর্ম্যাট স্ট্রিং তৈরি করব যেখানে ধূসর অংশগুলি প্রোগ্রামিকভাবে .োকানো হয়।

হ্যালো Test! আপনার কাছে 0নতুন বার্তা রয়েছে

আপনার string resource:

<স্ট্রিং নাম = "স্বাগতম_মেসেজ"> হ্যালো %1$s,! আপনার কাছে %2$dনতুন বার্তা রয়েছে </ string>

কি string substitutionনিচে দেওয়া হিসাবে:

getString (আর। স্ট্রিং। ওয়েলকাম_মেসেজ "Test",, 0);

বিঃদ্রঃ:

  • % 1 $ s "টেস্ট" স্ট্রিং দ্বারা প্রতিস্থাপিত হবে
  • % 2 $ d স্ট্রিং "0" দ্বারা প্রতিস্থাপিত হবে

16

আমি একই লিঙ্ক ত্রুটি বার্তায় দৌড়েছি এবং এটিকে সমাধান করেছি।

প্রথমদিকে আমার কোডটি ছিল:

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText("" + quantity);
}

আমি নিম্নলিখিত ত্রুটি পেয়েছি

Do not concatenate text displayed with setText. Use resource string with placeholders.

সুতরাং, আমি এটি যুক্ত strings.xml

<string name="blank">%d</string>

যা আমার প্রাথমিক "" + আমার সংখ্যার (পরিমাণ) জন্য একটি স্থানধারক।

দ্রষ্টব্য : আমার quantityপরিবর্তনশীলটি আগে সংজ্ঞায়িত হয়েছিল এবং আমি স্ট্রিংয়ের সাথে যুক্ত করতে চেয়েছিলাম। ফলাফল হিসাবে আমার কোড ছিল

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText(getString(R.string.blank, quantity));
}

এর পরে, আমার ত্রুটি চলে গেল। অ্যাপ্লিকেশনটিতে আচরণ পরিবর্তন হয়নি এবং আমি আমার লিঙ্ক ত্রুটি ছাড়াই এখন এটি চেয়েছিলাম হিসাবে আমার পরিমাণটি প্রদর্শিত হতে থাকে।


10

আপনার এই থ্রেডটি পরীক্ষা করা উচিত এবং তার মতো একটি স্থানধারক ব্যবহার করা উচিত (পরীক্ষিত নয়)

<string name="string_product_rate_with_ruppe_sign">Price : %1$d</string>

String text = String.format(getString(R.string.string_product_rate_with_ruppe_sign),new BigDecimal(price).setScale(2, RoundingMode.UP));
prodOriginalPriceView.setText(text);

10

আপনার ভিতরে না CONCATENATE টেক্সট কি , setText () পদ্ধতি, CONCATENATE কি কখনও আপনি একটি চান স্ট্রিং এবং আপনার ভিতরে স্ট্রিং মান করা , setText () পদ্ধতি।

প্রাক্তন: সঠিক উপায়

int min = 120;
int sec = 200;
int hrs = 2;

String minutes = String.format("%02d", mins);
            String seconds = String.format("%02d", secs);
            String newTime = hrs+":"+minutes+":"+seconds;

text.setText(minutes);

পছন্দ মত সেট টেক্সট () এর মধ্যে একত্রীকরণ করবেন না

text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));

কেন? একজনের অপরটির কী কী সুবিধা রয়েছে?
ফিউরিশ

4

সমস্যাটি হ'ল কারণ আপনি ""প্রতিটি স্ট্রিংয়ের শুরুতে সংযোজন করছেন।

লিন্ট setTextআপনার কাছে নিম্নলিখিত সতর্কতা প্রাসঙ্গিকভাবে প্রেরণে যুক্তিগুলি স্ক্যান করবে এবং সতর্কতা উত্পন্ন করবে:

পাঠ্য খণ্ডগুলি সহ্য করে বার্তা তৈরি করবেন না। এই জাতীয় বার্তাগুলি সঠিকভাবে অনুবাদ করা যায় না।

যেমন আপনি প্রতিটি স্ট্রিং সঙ্গে সংযোগ দিচ্ছেন ""

আপনি যে আর্গুমেন্টগুলি ইতিমধ্যে পাঠ্য হয়ে গেছেন তা এই কনটেন্টেশনটি সরান। এছাড়াও, .toString()আপনার স্ট্রিংটি সাথে যুক্ত করার পরিবর্তে অন্য কোথাও প্রয়োজন হলে আপনি ব্যবহার করতে পারেন""


0

আপনার যদি আই 18n সমর্থন করার প্রয়োজন না হয় তবে আপনি অ্যান্ড্রয়েড স্টুডিওতে এই লিন্ট চেকটি অক্ষম করতে পারেন

ফাইল -> সেটিংস -> সম্পাদক -> পরিদর্শন -> অ্যান্ড্রয়েড -> লিঙ্ক -> টেক্সটভিউ আন্তর্জাতিকীকরণ (এটি নির্বাচন করুন)


0

আপনি এটি ব্যবহার করতে পারেন, এটি আমার পক্ষে কাজ করে

title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));

0
prodNameView.setText("" + name); //this produce lint error

val nameStr="" + name;//workaround for quick warning fix require rebuild
prodNameView.setText(nameStr);

-1

ডোন্ট ম্যাড, এটা খুব সাধারণ Simple

String firstname = firstname.getText().toString();
String result = "hi "+ firstname +" Welcome Here";
            mytextview.setText(result);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.