无法为Android添加多种语言本地化。

huangapple go评论101阅读模式
英文:

Adding multiple language localization for android not working

问题

根据您的要求,以下是翻译好的内容:

ActivtyRide

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. // 在setContentView之前加载Locale
  4. loadLocale();
  5. setContentView(R.layout.activity_ride);
  6. ActionBar actionBar = getSupportActionBar();
  7. actionBar.setTitle(getResources().getString(R.string.app_name));
  8. }
  9. private void setLocale(String lang) {
  10. Locale locale = new Locale(lang);
  11. Locale.setDefault(locale);
  12. Configuration config = new Configuration();
  13. config.locale = locale;
  14. getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
  15. SharedPreferences.Editor editor = getSharedPreferences("Settings", MODE_PRIVATE).edit();
  16. editor.putString("My_Lang", lang);
  17. editor.apply();
  18. }
  19. public void loadLocale() {
  20. SharedPreferences prefs = getSharedPreferences("Settings", Activity.MODE_PRIVATE);
  21. String language = prefs.getString("My_Lang", "");
  22. setLocale(language);
  23. }

FragmentAllRides

  1. // ASYNTASK 从服务器获取数据 /////////////////////////////////////
  2. public class GetAllRides extends AsyncTask<String, Void, String> {
  3. @Override
  4. protected void onPreExecute() {
  5. }
  6. @Override
  7. protected String doInBackground(String... params) {
  8. }
  9. @Override
  10. protected void onPostExecute(String s) {
  11. rotateLoading.stop();
  12. relativeLayout.setVisibility(View.GONE);
  13. if (server_check) {
  14. if (server_response.equals("1")) {
  15. if (driver_name.length > 0) {
  16. adapter = new AllRidesAdapter(getActivity(),
  17. arrayList);
  18. listView.setAdapter(adapter);
  19. // 过滤数据
  20. EtSearch.addTextChangedListener(new TextWatcher() {
  21. @Override
  22. public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
  23. }
  24. @Override
  25. public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
  26. if (search_value.equals("source")) {
  27. adapter.getFilter().filter(charSequence);
  28. } else if (search_value.equals("destination")) {
  29. adapter.getFilter2().filter(charSequence);
  30. } else {
  31. Toast.makeText(getActivity(), "ass", Toast.LENGTH_SHORT).show();
  32. }
  33. }
  34. @Override
  35. public void afterTextChanged(Editable editable) {
  36. }
  37. });
  38. } else {
  39. Toast.makeText(getActivity(), server_response_text, Toast.LENGTH_SHORT).show();
  40. }
  41. } else {
  42. Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();
  43. }
  44. } else {
  45. Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.server_error), Toast.LENGTH_SHORT).show();
  46. }
  47. }
  48. }

Logcat

  1. java.lang.NullPointerException: 尝试调用虚拟方法 'android.content.res.Resources androidx.fragment.app.FragmentActivity.getResources()',但空对象引用
  2. at com.devqx.covoiturage.Ride.Home.FragmentAllRides$GetAllRides.onPostExecute(FragmentAllRides.java:672)
  3. at com.devqx.covoiturage.Ride.Home.FragmentAllRides$GetAllRides.onPostExecute(FragmentAllRides.java:464)
  4. at android.os.AsyncTask.finish(AsyncTask.java:755)

希望对您有所帮助。

英文:

Following this tutorial I tried to add French language in my app which is currently in English, (Not by changing the system language)

I added the translation in a separate strings file

It seems the problem is in my code. I'm not sure If I have to rewrite the same function in all my activity for it to work here is the code for switching language

Edit 2 : commenting this line fix the crash issue but the language is not updating.
Only the toast messages change to french but the UI layout isn't

  1. //Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();

ActivtyRide

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. //loadLocale before setContentView
  4. loadLocale();
  5. setContentView(R.layout.activity_ride);
  6. ActionBar actionBar = getSupportActionBar();
  7. actionBar.setTitle(getResources().getString(R.string.app_name));
  8. private void setLocale(String lang) {
  9. Locale locale = new Locale(lang);
  10. Locale.setDefault(locale);
  11. Configuration config = new Configuration();
  12. config.locale = locale;
  13. getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
  14. SharedPreferences.Editor editor = getSharedPreferences(&quot;Settings&quot;, MODE_PRIVATE).edit();
  15. editor.putString(&quot;My_Lang&quot;, lang);
  16. editor.apply();
  17. }
  18. public void loadLocale(){
  19. SharedPreferences prefs = getSharedPreferences(&quot;Settings&quot;, Activity.MODE_PRIVATE);
  20. String language = prefs.getString(&quot;My_Lang&quot;, &quot;&quot;);
  21. setLocale(language);
  22. }

And here is the Activity that causing me the crash

FragmentAllRides

  1. //ASYNTASK Getting Data From Server/////////////////////////////////////
  2. public class GetAllRides extends AsyncTask&lt;String, Void, String&gt; {
  3. @Override
  4. protected void onPreExecute() {
  5. }
  6. @Override
  7. protected String doInBackground(String... params) {
  8. }
  9. @Override
  10. protected void onPostExecute(String s) {
  11. rotateLoading.stop();
  12. relativeLayout.setVisibility(View.GONE);
  13. if (server_check) {
  14. if (server_response.equals(&quot;1&quot;)) {
  15. if (driver_name.length &gt; 0) {
  16. adapter = new AllRidesAdapter(getActivity(),
  17. arrayList);
  18. listView.setAdapter(adapter);
  19. //filtering data
  20. EtSearch.addTextChangedListener(new TextWatcher() {
  21. @Override
  22. public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
  23. }
  24. @Override
  25. public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
  26. if (search_value.equals(&quot;source&quot;)) {
  27. adapter.getFilter().filter(charSequence);
  28. } else if (search_value.equals(&quot;destination&quot;)) {
  29. adapter.getFilter2().filter(charSequence);
  30. } else {
  31. Toast.makeText(getActivity(), &quot;ass&quot;, Toast.LENGTH_SHORT).show();
  32. }
  33. }
  34. @Override
  35. public void afterTextChanged(Editable editable) {
  36. }
  37. });
  38. } else {
  39. Toast.makeText(getActivity(), server_response_text, Toast.LENGTH_SHORT).show();
  40. }
  41. } else {
  42. Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();
  43. }
  44. } else {
  45. Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.server_error), Toast.LENGTH_SHORT).show();
  46. }
  47. }
  48. }

Logcat

  1. java.lang.NullPointerException: Attempt to invoke virtual method &#39;android.content.res.Resources androidx.fragment.app.FragmentActivity.getResources()&#39; on a null object reference
  2. at com.devqx.covoiturage.Ride.Home.FragmentAllRides$GetAllRides.onPostExecute(FragmentAllRides.java:672)
  3. at com.devqx.covoiturage.Ride.Home.FragmentAllRides$GetAllRides.onPostExecute(FragmentAllRides.java:464)
  4. at android.os.AsyncTask.finish(AsyncTask.java:755)

Any ideas ?

答案1

得分: 0

getActivity()返回null

防止活动为空的最佳方法是在调用onAttach时保留活动引用,并在需要的地方使用活动引用。

示例:

  1. @Override
  2. public void onAttach(Context context) {
  3. super.onAttach(context);
  4. mContext = context;
  5. }
  6. @Override
  7. public void onDetach() {
  8. super.onDetach();
  9. mContext = null;
  10. }

现在在内部显示Toast:

  1. Toast.makeText(mContext, mContext.getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();

编辑:
onAttach(Activity)已弃用,现在使用onAttach(Context)

英文:

getActivity() return null

The best to prevent your activity being null is to keep activity reference when onAttach is called and use the activity reference wherever needed.

Ex:

  1. @Override
  2. public void onAttach(Context context) {
  3. super.onAttach(context);
  4. mContext = context;
  5. }
  6. @Override
  7. public void onDetach() {
  8. super.onDetach();
  9. mContext = null;
  10. }

And Now inside you show toast as

  1. Toast.makeText(mContext, mContext.getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();

Edited:
onAttach(Activity) is depreciated & now onAttach(Context) is being used

huangapple
  • 本文由 发表于 2020年9月3日 01:55:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/63711120.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定