为Android添加多语言本地化无法正常工作

问题描述

遵循此tutorial之后,我尝试在应用中添加法语(目前为英语)(不更改系统语言)

我在单独的字符串文件添加了翻译

问题似乎出在我的代码中。我不确定是否在我的所有活动中都必须重写相同的功能才能使其在这里正常工作,这是切换语言的代码

编辑2:注释此行可解决崩溃问题,但该语言未更新。 只有烤面包消息更改为法语,但UI布局不是

for (var i = 0; i < sortedKeysArray.length; i++) {
                   var key = 'Tgt-' + sortedKeysArray[i];
                    if (!(sortedKeysArray[i] == "LineNumber" || sortedKeysArray[i] == "AttributeName" || sortedKeysArray[i].includes("Tgt-") == true ))

                        $scope.gridOptionsVatMakeRpt.columnDefs.push({
                            name: sortedKeysArray[i],field: sortedKeysArray[i],width: '20%',visible: true,cellTooltip: function (row,col) {
                                
                                // var value = row.entity["Tgt-25"];
                                var value = row.entity[key];
                                if (value != null) {
                                    return value;
                                } else {
                                    return "No Value";
                                }
                            }

ActivityRide

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

这是导致我崩溃的活动

FragmentAllRides

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);
}

Logcat

 //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 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(),Toast.LENGTH_SHORT).show();
            }

        } else {
            Toast.makeText(getActivity(),getActivity().getResources().getString(R.string.server_error),Toast.LENGTH_SHORT).show();

        }
    }
}

有什么想法吗?

解决方法

getActivity()返回null

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

例如:

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