Използване на resx-низ от pcl в axml?

Имам resx-файловете за локализация в преносим клас-библиотека в клас MyAppResources. Така че в кода мога да получа локализирани низове само с:

 View.FindViewById<Button>(Resource.Id.btnCacheClear).Text = MyAppResources.TextClearCache;

Но има ли начин да зададете този низ вече в axml?

 <Button
     android:id="@+id/btnCacheClear"
     android:text= ??   />

Благодаря, Том


person Tom    schedule 03.04.2014    source източник


Отговори (2)


Предполагам, че най-чистият начин би бил да дефинирате персонализиран атрибут, който да чете от вашите PCL ресурси чрез ResourceManager.

Работя с MvvmCross и го накарах да работи с персонализиран парсер за обвързване на език:

public class CustomLanguageBindingParser : MvxBindingParser , IMvxLanguageBindingParser
{
    protected override MvxSerializableBindingDescription ParseBindingDescription()
    {
        this.SkipWhitespace();

        string resourceName = (string)this.ReadValue();

        // Pass the resource name in as the parameter on the StringResourceConverter.
        return new MvxSerializableBindingDescription
        {
            Converter = "StringResource",
            ConverterParameter = resourceName,
            Path = null,
            Mode = MvxBindingMode.OneTime
        };
    }

    public string DefaultConverterName { get; set; }

    public string DefaultTextSourceName { get; set; }
}

И конвертор:

public class StringResourceConverter : IMvxValueConverter
{
    private static ResourceManager manager = new ResourceManager(typeof(AppResources));

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Ignore value. We are using parameter only.
        return manager.GetString((string)parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Регистрирайте своя анализатор във вашия клас MvxAndroidSetup:

    protected override void InitializeIoC()
    {
        base.InitializeIoC();

        Mvx.RegisterType<IMvxLanguageBindingParser, CustomLanguageBindingParser>();
    }

Във вашия .axml дефинирайте пространство от имена xmlns:local="http://schemas.android.com/apk/res-auto"

И извикване на ресурса. Например на TextView: local:MvxLang="Text MyResourceKey"

Това се свързва със системата за свързване MvvmCross. Първата част „Текст“ определя целевото свойство, докато втората част се анализира като ресурсен ключ. Парсерът за езиково обвързване превежда това в обвързване с вашия персонализиран конвертор и ключа като параметър на конвертора. Конверторът извършва търсене на низ въз основа на параметъра на конвертора.

person RandomEngy    schedule 09.11.2015

Използването на низ/всякакви ресурси от RESX файл в Android Designer не се поддържа, настройката им от код е единственият възможен начин в момента.

person Prashant Cholachagudda    schedule 07.04.2014
comment
Разбрах, че работи в Designer само с android:text=@string/TextClearCache. Низът е взет от PCL и дори се променя правилно според езика в Designer. Но не се компилира: Грешка Не е намерен ресурс, който да съответства на даденото име (в „текст“ със стойност „@string/TextClearCache“) - person Tom; 07.04.2014