为 android 添加多语言本地化无效
Adding multiple language localization for android not working
在此之后 tutorial 我尝试在我目前使用英语的应用程序中添加法语,(不是通过更改系统语言)
我在单独的字符串文件中添加了翻译
看来问题出在我的代码中。我不确定是否必须在我的所有 activity 中重写相同的函数才能正常工作这里是切换语言的代码
编辑 2:评论此行修复了崩溃问题,但语言没有更新。
只有 toast 消息更改为法语,但 UI 布局不是
//Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();
ActivtyRide
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//loadLocale before setContentView
loadLocale();
setContentView(R.layout.activity_ride);
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(getResources().getString(R.string.app_name));
private void setLocale(String lang) {
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
SharedPreferences.Editor editor = getSharedPreferences("Settings", MODE_PRIVATE).edit();
editor.putString("My_Lang", lang);
editor.apply();
}
public void loadLocale(){
SharedPreferences prefs = getSharedPreferences("Settings", Activity.MODE_PRIVATE);
String language = prefs.getString("My_Lang", "");
setLocale(language);
}
这是导致我崩溃的 Activity
FragmentAllRides
//ASYNTASK Getting Data From Server/////////////////////////////////////
public class GetAllRides extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... params) {
}
@Override
protected void onPostExecute(String s) {
rotateLoading.stop();
relativeLayout.setVisibility(View.GONE);
if (server_check) {
if (server_response.equals("1")) {
if (driver_name.length > 0) {
adapter = new AllRidesAdapter(getActivity(),
arrayList);
listView.setAdapter(adapter);
//filtering data
EtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if (search_value.equals("source")) {
adapter.getFilter().filter(charSequence);
} else if (search_value.equals("destination")) {
adapter.getFilter2().filter(charSequence);
} else {
Toast.makeText(getActivity(), "ass", Toast.LENGTH_SHORT).show();
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
} else {
Toast.makeText(getActivity(), server_response_text, Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.server_error), Toast.LENGTH_SHORT).show();
}
}
}
Logcat
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources androidx.fragment.app.FragmentActivity.getResources()' on a null object reference
at com.devqx.covoiturage.Ride.Home.FragmentAllRides$GetAllRides.onPostExecute(FragmentAllRides.java:672)
at com.devqx.covoiturage.Ride.Home.FragmentAllRides$GetAllRides.onPostExecute(FragmentAllRides.java:464)
at android.os.AsyncTask.finish(AsyncTask.java:755)
有什么想法吗?
getActivity()
return null
防止 activity 为 null 的最佳方法是在调用 onAttach
时保留 activity 引用,并在需要时使用 activity 引用。
例如:
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
}
@Override
public void onDetach() {
super.onDetach();
mContext = null;
}
现在你在里面显示吐司为
Toast.makeText(mContext, mContext.getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();
已编辑:
onAttach(Activity)
已贬值,现在正在使用 onAttach(Context)
在此之后 tutorial 我尝试在我目前使用英语的应用程序中添加法语,(不是通过更改系统语言)
我在单独的字符串文件中添加了翻译
看来问题出在我的代码中。我不确定是否必须在我的所有 activity 中重写相同的函数才能正常工作这里是切换语言的代码
编辑 2:评论此行修复了崩溃问题,但语言没有更新。 只有 toast 消息更改为法语,但 UI 布局不是
//Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();
ActivtyRide
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//loadLocale before setContentView
loadLocale();
setContentView(R.layout.activity_ride);
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(getResources().getString(R.string.app_name));
private void setLocale(String lang) {
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
SharedPreferences.Editor editor = getSharedPreferences("Settings", MODE_PRIVATE).edit();
editor.putString("My_Lang", lang);
editor.apply();
}
public void loadLocale(){
SharedPreferences prefs = getSharedPreferences("Settings", Activity.MODE_PRIVATE);
String language = prefs.getString("My_Lang", "");
setLocale(language);
}
这是导致我崩溃的 Activity
FragmentAllRides
//ASYNTASK Getting Data From Server/////////////////////////////////////
public class GetAllRides extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... params) {
}
@Override
protected void onPostExecute(String s) {
rotateLoading.stop();
relativeLayout.setVisibility(View.GONE);
if (server_check) {
if (server_response.equals("1")) {
if (driver_name.length > 0) {
adapter = new AllRidesAdapter(getActivity(),
arrayList);
listView.setAdapter(adapter);
//filtering data
EtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if (search_value.equals("source")) {
adapter.getFilter().filter(charSequence);
} else if (search_value.equals("destination")) {
adapter.getFilter2().filter(charSequence);
} else {
Toast.makeText(getActivity(), "ass", Toast.LENGTH_SHORT).show();
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
} else {
Toast.makeText(getActivity(), server_response_text, Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.server_error), Toast.LENGTH_SHORT).show();
}
}
}
Logcat
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources androidx.fragment.app.FragmentActivity.getResources()' on a null object reference
at com.devqx.covoiturage.Ride.Home.FragmentAllRides$GetAllRides.onPostExecute(FragmentAllRides.java:672)
at com.devqx.covoiturage.Ride.Home.FragmentAllRides$GetAllRides.onPostExecute(FragmentAllRides.java:464)
at android.os.AsyncTask.finish(AsyncTask.java:755)
有什么想法吗?
getActivity()
return null
防止 activity 为 null 的最佳方法是在调用 onAttach
时保留 activity 引用,并在需要时使用 activity 引用。
例如:
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
}
@Override
public void onDetach() {
super.onDetach();
mContext = null;
}
现在你在里面显示吐司为
Toast.makeText(mContext, mContext.getResources().getString(R.string.no_rides_found), Toast.LENGTH_SHORT).show();
已编辑:
onAttach(Activity)
已贬值,现在正在使用 onAttach(Context)