Невозможно переопределить AttachBaseContext () в xamarin android - PullRequest
0 голосов
/ 14 февраля 2020

Я пытался использовать этот метод.

protected override void AttachBaseContext(context @base)
{
    Context con = LanguageManager.NewLocale(@base, 
    LanguageManager.SelectNewLanguage(@base));
    base.AttachBaseContext(@base));
}

Когда я запускаю свое приложение, оно автоматически получает cra sh.

1 Ответ

0 голосов
/ 17 февраля 2020

Поскольку вы предоставляете меньше информации, если вы хотите создать функцию, которая могла бы изменить язык в вашем приложении.

1.the LanguageManager class

internal class LanguageManager
{
    private const string MYLANGUAGE = "myLanguage";
    private const string MYPREF = "myPreference";

    public static Context LoadLanguage(Context context)
    {
        var loadedLanguage = GetLanguage(context, Locale.Default.Language);
        return ChangeLanguage(context, loadedLanguage);
    }

    public static Context ChangeLanguage(Context context, string language)
    {
        SaveLanguage(context, language);
        if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
        {
            return ChangeForAPI24(context, language);
        }
        return ChangeForLegacy(context, language);
    }

    private static string GetLanguage(Context context, string Language)
    {
        var privatePreference = context.GetSharedPreferences(MYPREF, FileCreationMode.Private);
        return privatePreference.GetString(MYLANGUAGE, Language);
    }

    private static void SaveLanguage(Context context, string language)
    {
        var privatePreference = context.GetSharedPreferences(MYPREF, FileCreationMode.Private);
        var editor = privatePreference.Edit();
        editor.PutString(MYLANGUAGE, language);
        editor.Apply();
    }

    private static Context ChangeForAPI24(Context context, string language)
    {
        // for api >= 24
        var locale = new Locale(language);
        Locale.Default = locale;
        var configuration = context.Resources.Configuration;
        configuration.SetLocale(locale);
        configuration.SetLayoutDirection(locale);

        return context.CreateConfigurationContext(configuration);
    }

    private static Context ChangeForLegacy(Context context, string language)
    {
        var locale = new Locale(language);
        Locale.Default = locale;
        var resources = context.Resources;
        var configuration = resources.Configuration;
        configuration.Locale = locale;
        resources.UpdateConfiguration(configuration, resources.DisplayMetrics);
        return context;
    }
}

2. MainActivity , которая включает в себя TextView и кнопку;

3.in BaseActivity

public class BaseActivity: AppCompatActivity
{
    protected override void AttachBaseContext(Context @base)
    {
        base.AttachBaseContext(LanguageManager.LoadLanguage(@base));
    }

}

4.in SettingActivity , который может установить язык, а xml похож на ваш

public class SettingActivity : BaseActivity, CompoundButton.IOnCheckedChangeListener
{
    private Switch swCh;
    private Switch swEn;
    private Switch swTh;
    private Bundle s;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.setting);
        // Create your application here
        initView();
    }

    private void initView()
    {
        Button back = FindViewById<Button>(Resource.Id.back);
        back.Click += delegate { Finish(); };
        swCh = FindViewById<Switch>(Resource.Id.switch1);
        swEn = FindViewById<Switch>(Resource.Id.switch2);
        swTh = FindViewById<Switch>(Resource.Id.switch3);
        var s = GetSharedPreferences("myPreference", FileCreationMode.Private).GetString( "myLanguage", Locale.Default.Language);
        switch (s)
        {
            case "ch":
                swCh.Checked = true;
                break;
            case "en":
                swEn.Checked = true;
                break;
            case "th":
                swTh.Checked = true;
                break;
        }
        swCh.SetOnCheckedChangeListener(this);
        swEn.SetOnCheckedChangeListener(this);
        swTh.SetOnCheckedChangeListener(this);
    }

    public void OnCheckedChanged(CompoundButton buttonView, bool isChecked)
    {
        if (isChecked)
        {

        switch (buttonView.Id)
        {
            case Resource.Id.switch1:
                swEn.Checked = false;
                swTh.Checked = false;
                LanguageManager.ChangeLanguage(this, "ch");
                break;
            case Resource.Id.switch2:
                swCh.Checked = false;
                swTh.Checked = false;
                LanguageManager.ChangeLanguage(this, "en");
                    break;
            case Resource.Id.switch3:
                swEn.Checked = false;
                swCh.Checked = false;
                LanguageManager.ChangeLanguage(this, "th");
                    break;
        }
             //restart application to change language
            Intent intent = new Intent(this, typeof(MainActivity));
            intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);
            StartActivity(intent);
        }
    }

}

, на который можно сослаться здесь

...