Как вы решаете, какой пользователь выбрал язык (или локаль) в программировании Android?

В основной деятельности я показываю пользователям набор языков.

<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textViewSelection"
    android:layout_centerHorizontal="true"
    android:orientation="vertical"
    android:gravity="center_horizontal">

    <RadioButton
        android:id="@+id/english_lang"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onRadioButtonClicked"
        android:text="@string/langtext_english"
        android:textSize="22dp"
        android:padding="10dp" />

    <RadioButton
        android:id="@+id/indonesian_lang"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onRadioButtonClicked"
        android:text="@string/langtext_indonesian"
        android:textSize="22dp"
        android:padding="10dp" />
</RadioGroup>

Когда пользователь выбирает язык, я перехожу к методу onRadioButtonClicked(), расположенному внутри класса MainActivityFragment.java

 public void onRadioButtonClicked(View view){
        boolean checked = ((RadioButton) view).isChecked();

        // Check which radio button was clicked
        switch(view.getId()) {
            case R.id.english_lang:
                if (checked)
                    //
                    break;
            case R.id.french_lang:
                if (checked)
                    // Ninjas rule
                    break;
        }

    }

В директории res я создал новую папку под названием values-fr и поместил string.xml с французскими значениями.

1) Как передать выбранный пользователем язык всему контексту приложения и использовать его ДАЛЕЕ и НАВСЕГДА?

2) Почему мой метод никогда не используется?

MainActivityFragment.java

package com.a2ndnumber.a2ndnumber;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.RadioButton;

/**
 * A placeholder fragment containing a simple view.
 */
public class MainActivityFragment extends Fragment {

    private ArrayAdapter<String> countryList_Adapter;

    public MainActivityFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_main, container, false);

        return rootView;
    }


    public void onRadioButtonClicked(View view){
        boolean checked = ((RadioButton) view).isChecked();

        // Check which radio button was clicked
        switch(view.getId()) {
            case R.id.english_lang:
                if (checked)
                    //
                    break;
            case R.id.indonesian_lang:
                if (checked)
                    // Ninjas rule
                    break;
        }

    }

    /*
   * When user is selecting the country, in background we grab 25 numbers of each country,
   * so that we are ready in next fragment where we let them choose the number
   * */
    public class FetchNumbers_Task extends AsyncTask<Void, Void, Void>{

        private final String LOG_TAG = FetchNumbers_Task.class.getSimpleName();

        /**
         * Override this method to perform a computation on a background thread. The
         * specified parameters are the parameters passed to {@link #execute}
         * by the caller of this task.
         * <p/>
         * This method can call {@link #publishProgress} to publish updates
         * on the UI thread.
         *
         * @param params The parameters of the task.
         * @return A result, defined by the subclass of this task.
         * @see #onPreExecute()
         * @see #onPostExecute
         * @see #publishProgress
         */
        @Override
        protected Void doInBackground(Void... params) {
            return null;
        }
    }
}

1 ответ

Вы можете изменить язык приложения, используя следующий код:

    public void setLocale(String lang) {
    myLocale = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
    Intent refresh = new Intent(this, Youractivity.class); // refresh the activity 
    refresh.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    refresh.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(refresh);
    finish();
    }

А чтобы получить прослушиватель кликов Radio Buttons, используйте:

mRadioHindi.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (b){
                Log.d("SettingsActivity::","onCheckedChanged hindi" + b);
                PreferenceManager.saveLanguage("hi");
                setLocale("hi");
            }
        }
    });

Используйте setOnCheckedChangeListener для всех переключателей.

Сохраните язык в общих настройках и в следующий раз, когда пользователь откроет приложение, получите язык из sharedPreference и вызовите метод setLocale().

Другие вопросы по тегам