একটি নির্ধারিত আপডেটের জন্য সময়।
প্রথমে, এপিআই-এর সাথে অবহেলিত তালিকাটি যেখানে এটি হ্রাস করা হয়েছিল:
configuration.locale
(এপিআই 17)
updateConfiguration(configuration, displaymetrics)
(এপিআই 17)
সম্প্রতি কোনও প্রশ্নের উত্তরের যে জিনিসটি সঠিকভাবে অর্জন করেছে তা হ'ল নতুন পদ্ধতির ব্যবহার ।
#ConfigrationContext আপডেট কনফিগারেশনের নতুন পদ্ধতি।
কেউ কেউ এটিকে এককভাবে ব্যবহার করেছেন:
Configuration overrideConfiguration = ctx.getResources().getConfiguration();
Locale locale = new Locale("en_US");
overrideConfiguration.setLocale(locale);
createConfigurationContext(overrideConfiguration);
... কিন্তু কাজ করে না কেন? পদ্ধতিটি একটি প্রসঙ্গ ফেরত দেয়, যা স্ট্রিংস.এক্সএমএল অনুবাদ এবং অন্যান্য স্থানীয়ীকৃত সংস্থানসমূহ (চিত্র, বিন্যাস, যাই হোক না কেন) হ্যান্ডেল করতে ব্যবহৃত হয়।
সঠিক ব্যবহারটি হ'ল:
Configuration overrideConfiguration = ctx.getResources().getConfiguration();
Locale locale = new Locale("en_US");
overrideConfiguration.setLocale(locale);
//the configuration can be used for other stuff as well
Context context = createConfigurationContext(overrideConfiguration);
Resources resources = context.getResources();
যদি আপনি কেবল এটির আইডিইতে অনুলিপি করে থাকেন তবে আপনি একটি সতর্কতা দেখতে পাবেন যে এপিআই আপনার 17 বা ততোধিকের উপরে লক্ষ্যবস্তু করা উচিত। এটিকে কোনও পদ্ধতিতে রেখে এবং টীকা যুক্ত করে কাজ করা যেতে পারে@TargetApi(17)
কিন্তু অপেক্ষা করো. পুরানো এপিআই এর কী হবে?
টার্গেটএপি টীকা ছাড়াই আপনাকে আপডেট কনফিগারেশন ব্যবহার করে অন্য একটি পদ্ধতি তৈরি করতে হবে।
Resources res = YourApplication.getInstance().getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale("th");
res.updateConfiguration(conf, dm);
আপনাকে এখানে কোনও প্রসঙ্গে ফেরত দেওয়ার দরকার নেই।
এখন, এগুলি পরিচালনা করা কঠিন হতে পারে। স্থানীয়করণের উপর ভিত্তি করে উপযুক্ত সংস্থান পেতে আপনার এপিআই 17+ এ প্রসঙ্গ তৈরি করা (বা তৈরি করা প্রসঙ্গ থেকে সংস্থানগুলি) দরকার। তুমি কীভাবে এটা পরিচালনা করো?
ঠিক আছে, আমি এইভাবেই এটি করি:
/**
* Full locale list: /programming/7973023/what-is-the-list-of-supported-languages-locales-on-android
* @param lang language code (e.g. en_US)
* @return the context
* PLEASE READ: This method can be changed for usage outside an Activity. Simply add a COntext to the arguments
*/
public Context setLanguage(String lang/*, Context c*/){
Context c = AndroidLauncher.this;//remove if the context argument is passed. This is a utility line, can be removed totally by replacing calls to c with the activity (if argument Context isn't passed)
int API = Build.VERSION.SDK_INT;
if(API >= 17){
return setLanguage17(lang, c);
}else{
return setLanguageLegacy(lang, c);
}
}
/**
* Set language for API 17
* @param lang
* @param c
* @return
*/
@TargetApi(17)
public Context setLanguage17(String lang, Context c){
Configuration overrideConfiguration = c.getResources().getConfiguration();
Locale locale = new Locale(lang);
Locale.setDefault(locale);
overrideConfiguration.setLocale(locale);
//the configuration can be used for other stuff as well
Context context = createConfigurationContext(overrideConfiguration);//"local variable is redundant" if the below line is uncommented, it is needed
//Resources resources = context.getResources();//If you want to pass the resources instead of a Context, uncomment this line and put it somewhere useful
return context;
}
public Context setLanguageLegacy(String lang, Context c){
Resources res = c.getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();//Utility line
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale(lang);//setLocale requires API 17+ - just like createConfigurationContext
Locale.setDefault(conf.locale);
res.updateConfiguration(conf, dm);
//Using this method you don't need to modify the Context itself. Setting it at the start of the app is enough. As you
//target both API's though, you want to return the context as you have no clue what is called. Now you can use the Context
//supplied for both things
return c;
}
এই কোডটি এমন একটি পদ্ধতি রেখে কাজ করে যা কোন এপিআই এর উপর ভিত্তি করে উপযুক্ত পদ্ধতিতে কল করে। এটি এমন অনেক কিছু যা আমি হ'ল প্রচুর অবহেলিত কল (Html.fromHtml সহ) দিয়ে। আপনার কাছে একটি পদ্ধতি রয়েছে যা প্রয়োজনীয় আর্গুমেন্টগুলি গ্রহণ করে যা এরপরে এটিকে দুটি (বা তিন বা ততোধিক) পদ্ধতির মধ্যে বিভক্ত করে এবং এপিআই স্তরের ভিত্তিতে উপযুক্ত ফলাফল প্রদান করে returns এটি নমনীয় যেহেতু আপনাকে একাধিকবার পরীক্ষা করতে হবে না, "এন্ট্রি" পদ্ধতিটি এটি আপনার জন্য করে। এখানে প্রবেশ-পদ্ধতিটিsetLanguage
এটি ব্যবহারের পূর্বে দয়া করে পড়ুন
আপনি যখন রিসোর্সগুলি পাবেন তখন আপনার প্রসঙ্গে ফিরে আসা প্রসঙ্গটি ব্যবহার করতে হবে। কেন? আমি এখানে অন্যান্য উত্তরগুলি দেখেছি যারা ক্রেডিট কনফিগারেশন কনটেক্সট ব্যবহার করে এবং যে প্রসঙ্গে ফিরে আসে তা ব্যবহার করে না। এটি এর মতো কাজ করতে, আপডেট কনফিগারেশন কল করতে হবে। যা অবমূল্যায়িত হয়। রিসোর্স পেতে পদ্ধতিতে ফিরে আসা প্রসঙ্গটি ব্যবহার করুন।
ব্যবহারের উদাহরণ :
নির্মাতা বা অন্য কোথাও অনুরূপ:
ctx = getLanguage(lang);//lang is loaded or generated. How you get the String lang is not something this answer handles (nor will handle in the future)
এবং তারপরে, আপনি যেখানেই রিসোর্স পেতে চান:
String fromResources = ctx.getString(R.string.helloworld);
অন্য কোনও প্রসঙ্গ ব্যবহার করা (তত্ত্বীয়ভাবে) এটি ভেঙে দেবে।
এএআইএআইএকি ডায়ালগ বা টোস্টগুলি দেখানোর জন্য আপনাকে এখনও কোনও ক্রিয়াকলাপের প্রসঙ্গ ব্যবহার করতে হবে। তার জন্য আপনি কোনও ক্রিয়াকলাপের উদাহরণ ব্যবহার করতে পারেন (যদি আপনি বাইরে থাকেন)
এবং পরিশেষে, recreate()
সামগ্রীটি রিফ্রেশ করার জন্য ক্রিয়াকলাপটিতে ব্যবহার করুন। রিফ্রেশ করার জন্য একটি উদ্দেশ্য তৈরি করতে হবে না শর্টকাট।