是否可以在带参数的 strings.xml 格式字符串中包含 %n 换行符?
Is it possible to have %n newlines in strings.xml format strings with parameters?
我在 android 格式字符串中使用 %n
换行符时遇到问题。
这是预期的输出:
Address Line 1
City, State
所以我创建了一个这样的格式字符串:
%s%n%s, %s
但是我得到了这个错误:
Error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?
我的字符串是格式化的,所以第二个解决方案似乎没有意义,所以我将 %s
的位置设为:
%1$s%n%2$s, %3$s
但是我还是遇到了同样的错误。
所以我也尝试使 %n
位置化,看看是否能解决问题:
%1$s%4$n%2$s, %3$s
然后 java.util.Formatter
:
我得到一个运行时错误 (!!!)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app, PID: 27843
java.util.IllegalFormatFlagsException: %n doesn't take an argument
at java.util.Formatter$FormatToken.checkFlags(Formatter.java:1373)
at java.util.Formatter.transform(Formatter.java:1442)
at java.util.Formatter.doFormat(Formatter.java:1081)
at java.util.Formatter.format(Formatter.java:1042)
at java.util.Formatter.format(Formatter.java:1011)
at java.lang.String.format(String.java:1554)
at android.content.res.Resources.getString(Resources.java:431)
... // omitting project specific files
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:536)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5497)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
如何在带有其他格式参数的 strings.xml 格式字符串中包含 %n
换行符?可能吗?如果不是,显示换行符的最佳方式是什么?
Android 文档或 api 指南参考将不胜感激。
这可能是一个错误。
查看 AAPT 来源——特别是 hasSubstitutionErrors method。它计算字符串中参数的数量以检查它们是否应该是位置的。它确保跳过文字百分号 (%%
) 但不会跳过特定于平台的换行符 (%n
).
我已经在 issue tracker.
中提出了这个问题
此时除了使用 \n
.
我没有看到其他解决方案
编辑:问题已在跟踪器中标记为已修复。
我在 android 格式字符串中使用 %n
换行符时遇到问题。
这是预期的输出:
Address Line 1
City, State
所以我创建了一个这样的格式字符串:
%s%n%s, %s
但是我得到了这个错误:
Error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?
我的字符串是格式化的,所以第二个解决方案似乎没有意义,所以我将 %s
的位置设为:
%1$s%n%2$s, %3$s
但是我还是遇到了同样的错误。
所以我也尝试使 %n
位置化,看看是否能解决问题:
%1$s%4$n%2$s, %3$s
然后 java.util.Formatter
:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app, PID: 27843
java.util.IllegalFormatFlagsException: %n doesn't take an argument
at java.util.Formatter$FormatToken.checkFlags(Formatter.java:1373)
at java.util.Formatter.transform(Formatter.java:1442)
at java.util.Formatter.doFormat(Formatter.java:1081)
at java.util.Formatter.format(Formatter.java:1042)
at java.util.Formatter.format(Formatter.java:1011)
at java.lang.String.format(String.java:1554)
at android.content.res.Resources.getString(Resources.java:431)
... // omitting project specific files
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:536)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5497)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
如何在带有其他格式参数的 strings.xml 格式字符串中包含 %n
换行符?可能吗?如果不是,显示换行符的最佳方式是什么?
Android 文档或 api 指南参考将不胜感激。
这可能是一个错误。
查看 AAPT 来源——特别是 hasSubstitutionErrors method。它计算字符串中参数的数量以检查它们是否应该是位置的。它确保跳过文字百分号 (%%
) 但不会跳过特定于平台的换行符 (%n
).
我已经在 issue tracker.
中提出了这个问题此时除了使用 \n
.
编辑:问题已在跟踪器中标记为已修复。