2016-10-13 2 views
3

Ok так это:Android Котлин StringRes quantityString

fun Context.quantityFromRes(id_: Int, qtt:Int, vararg format: Any) = resources.getQuantityString(id_, qtt, format) 

XML:

<plurals name="header_view"> 
     <item quantity="one">Oh no! You just lost %1$d Point</item> 
     <item quantity="other">Oh no! You just lost %1$d Points</item> 
    </plurals> 

дает эту ошибку:

"java.util.IllegalFormatConversionException: %d can't format [Ljava.lang.Object; arguments" 

Кажущаяся Java исправить:

public class XmlPluralFormatter { 
    private XmlPluralFormatter() { 
     throw new IllegalStateException("You can't fuck me =("); 
    } 

    public static String getFormattedString(Context context, int stringRes, int qtt, Object... formatArgs){ 
     return context.getResources().getQuantityString(stringRes,qtt, formatArgs); 
    } 

    public static String getFormattedString(Context context, int stringRes, int qtt){ 
     return context.getResources().getQuantityString(stringRes,qtt); 
    } 
} 
  • Я только понял, что использование этого через Java решит проблему, но я понятия не имею, есть ли способ Kotlin выполнить то же самое.

PS: Забыл вызов:

val qtt: Int = 123 
context.quantityFromRes(R.plurals.header, qty) 

Я также могу это сделать:

fun Context.quantityFromRes(id_: Int, qtt:Int, vararg format: Object) = resources.getQuantityString(id_, qtt, format) 

но

Required Object, found Int 

Я также могу бросить:

context.quantityFromRes(R.plurals.header, qty, qt as Object) 

но также дает:

"java.util.IllegalFormatConversionException: %d can't format [Ljava.lang.Object; arguments" 

Кроме того, с помощью кода непосредственно без функции расширения работы:

context.resources.getQuantityString(R.plurals.header, qtt, qtt) 

ответ

3

Проблема заключается вы передаете format аргумент в качестве единственного параметра вместо того, чтобы распространять его Object... args. Метод расширения:

fun Context.quantityFromRes(id_: Int, qtt:Int, vararg format: Any) = resources.getQuantityString(id_, qtt, format) 

эквивалентно:

fun Context.quantityFromRes(id_: Int, qtt: Int, vararg format: Any): String? { 
    val args: Array<out Any> = format 
    return resources.getQuantityString(id_, qtt, args) 
} 

Что в Java плане выглядит как:

public static final String quantityFromRes(Context $receiver, int id_, int qtt, Object... format) { 
    return $receiver.getResources().getQuantityString(id_, qtt, new Object[]{format}); 
} 

То, что вы хотите сделать вместо этого использовать spread operator:

fun Context.quantityFromRes(id_: Int, qtt: Int, vararg format: Any): String? { 
    return resources.getQuantityString(id_, qtt, *format) 
} 
Смежные вопросы