Не могу полностью изменить язык моего приложения - PullRequest
2 голосов
/ 04 марта 2020

Я новичок ie в Android Studio, и я застрял в проблеме изменения языка. Я надеюсь, что мое приложение позволит нам изменить его язык, нажав кнопку «Сохранить» в диалоговом окне настроек, после того как мы изменим язык на счетчике. Например, если я выберу «Engli sh», язык приложения должен превратиться в Engli sh, хотя язык телефона - это нечто другое. Чтобы сделать это, я искал Inte rnet и импортировал класс LocalHelper, который помог мне изменить язык MainActivity с помощью кнопки. Вот код:

package com.example.evolutionarytree;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button searchButton;
    Button lifeTreeButton;
    Button settingsButton;
    TextView experiment;

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base));
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Context context = ElephasMaximus.this;
        searchButton = findViewById(R.id.search);
        lifeTreeButton = findViewById(R.id.lifeTree);
        settingsButton = findViewById(R.id.settings);
        experiment = findViewById(R.id.experiment);


        searchButton.setOnClickListener(this);
        lifeTreeButton.setOnClickListener(this);
        settingsButton.setOnClickListener(this);

    }


    @Override
    public void onClick(View v) {
        if (v == searchButton) {

        }
        else if (v == lifeTreeButton) {
            Intent intent = new Intent(this, ElephasMaximus.class);
            startActivity(intent);
        }
        else if (v == settingsButton) {
            SettingDialog settingDialog = new SettingDialog(this);
            settingDialog.setDialogListener(new SettingDialog.CustomDialogListener() {
                @Override
                public void onPositiveClicked(String language) {
                    //Change Application level locale
                    LocaleHelper.setLocale(MainActivity.this, language);

                    //It is required to recreate the activity to reflect the change in UI.
                    recreate();

                    experiment.setText(language);
                }

                @Override
                public void onNegativeClicked() {

                }
            });
            settingDialog.show();

            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);

            Window window = settingDialog.getWindow();

            int x = (int)(size.x * 0.8f);
            int y = (int)(size.y * 0.4f);

            window.setLayout(x, y);

        }
    }
}

Это было MainActivity. Далее следует LocaleHelper:

package com.example.evolutionarytree;

public class LocaleHelper {

    private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";

    public static Context onAttach(Context context) {
        String lang = getPersistedData(context, Locale.getDefault().getLanguage());
        return setLocale(context, lang);
    }

    public static Context onAttach(Context context, String defaultLanguage) {
        String lang = getPersistedData(context, defaultLanguage);
        return setLocale(context, lang);
    }

    public static String getLanguage(Context context) {
        return getPersistedData(context, Locale.getDefault().getLanguage());
    }

    public static Context setLocale(Context context, String language) {
        persist(context, language);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, language);
        }

        return updateResourcesLegacy(context, language);
    }

    private static String getPersistedData(Context context, String defaultLanguage) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
    }

    private static void persist(Context context, String language) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();

        editor.putString(SELECTED_LANGUAGE, language);
        editor.apply();
    }

    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);

        return context.createConfigurationContext(configuration);
    }

    @SuppressWarnings("deprecation")
    private static Context updateResourcesLegacy(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Resources resources = context.getResources();

        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;

        resources.updateConfiguration(configuration, resources.getDisplayMetrics());

        return context;
    }
}

Последний код - это диалоговое окно:

package com.example.evolutionarytree;

public class SettingDialog extends Dialog implements View.OnClickListener {

    Button saveButton;
    ImageButton closeButton;
    Button sendButton;
    Context context;
    Spinner languageSpinner;

    CustomDialogListener customDialogListener;

    public SettingDialog(@NonNull Context context) {
        super(context);
        this.context = context;
    }

    interface CustomDialogListener{
        void onPositiveClicked(String language);
        void onNegativeClicked();
    }

    public void setDialogListener(CustomDialogListener customDialogListener){
        this.customDialogListener = customDialogListener;
    }

    Resources res = getContext().getResources();
    String[] languageArray= res.getStringArray(R.array.language);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.setting_dialog);

        saveButton = findViewById(R.id.savebutton);
        closeButton = findViewById(R.id.closebutton);
        sendButton = findViewById(R.id.sendbutton);

        languageSpinner = findViewById(R.id.languageSpinner);


        ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(getContext(),
                R.array.language, android.R.layout.simple_spinner_item);
        arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        languageSpinner.setAdapter(arrayAdapter);


        saveButton.setOnClickListener(this);
        closeButton.setOnClickListener(this);
        sendButton.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.savebutton:
                if(languageSpinner.getSelectedItem().toString().equals(languageArray[0])) {
                    String languageString = "ko";
                    customDialogListener.onPositiveClicked(languageString);
                }
                else if (languageSpinner.getSelectedItem().toString().equals(languageArray[1])) {
                    String languageString = "en";
                    customDialogListener.onPositiveClicked(languageString);
                }

                dismiss();
                break;
            case R.id.closebutton:
                cancel();
                break;

            case R.id.sendbutton:
                Intent email = new Intent(Intent.ACTION_SEND);
                email.setType("plain/Text");
                String[] address = {"My Email. HaHaHa"};
                email.putExtra(Intent.EXTRA_EMAIL, address);
                email.putExtra(Intent.EXTRA_SUBJECT, R.string.bug);
                context.startActivity(email);

        }
    }
}

Теперь проблема в том, что я могу изменить язык MainActivity благодаря LocaleHelper. Но язык другой деятельности не меняется. Как я могу решить эту проблему? Что я хочу, нажав кнопку «Сохранить» в диалоговом окне, весь язык приложения изменится на язык, который я выбрал из счетчика.

1 Ответ

0 голосов
/ 05 марта 2020

После изменения локали перезапустите действие

fun restartActivity(){
        startActivity(Intent(this@your_activity, your_activity::class.java)
                .also {
                    it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                    it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)                  
                })
        finish()
        finishAffinity()

    }
...