为 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)