2016-10-13 7 views
3

ので、この:アンドロイドKotlin 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) 
} 
関連する問題