在末尾附加空消息时显示资源 ID 而不是字符串

Resource ID showing instead of string when appending null message at the end

在我的一个函数中,如果出现错误,我会生成一条 Toast 消息。该消息调用资源 ID 并从上一个错误中获取消息。如果最后一个错误 return 为 null,则显示实际的 int ID,而不是取消引用的字符串。

Toast.makeText(SelectionActivity.this, 
               (R.string.error_onCanceled + " " mLastError.getMessage()),  
                Toast.LENGTH_SHORT).show();

2131689536 null

Toast.makeText(SelectionActivity.this,
                (R.string.error_onCanceled),
                  Toast.LENGTH_SHORT).show();

On Canceled: error =
** this is my string from the resource file

我不明白为什么将 null 附加到字符串的末尾会使它 return 成为 int ID 而不是字符串。

R.string.error_onCanceled 是一个 int.

makeText()有两种形式。一个接受 int,将其视为字符串资源 ID。另一个取 CharSequenceString.

Toast.makeText(SelectionActivity.this,
            (R.string.error_onCanceled),
              Toast.LENGTH_SHORT).show();

这使用了一个 int 并使用你的字符串资源。

对于另一个,你有 R.string.error_onCanceled + " " mLastError.getMessage()。这不编译。我假设您的意思是 R.string.error_onCanceled + " " + mLastError.getMessage()。在那种情况下,Java 所能做的就是:

  • 将您的 int 转换为 String

  • 将它与其他字符串连接起来

但是 Java 将 int 按字面意思转换为 String,因为 Java 不知道 Android 字符串资源。

解决此问题的最直接方法是使用 getString(R.string.error_onCanceled_) + " " + mLastError.getMessage(),因此您要求 Android 为您提供与字符串资源 ID 关联的字符串。

或者,您可以更改字符串资源以在其中包含 %d:

<string name="error_onCanceled">** this is my string from the resource file %s</string>

然后,您将使用 getString(R.string.error_onCanceled, mLastError.getMessage()) 获取组合消息以传递给 Toast

无论如何,如果您不将纯字符串资源 ID 传递到 makeText(),则需要使用 getString()

当您以这种方式与字符串连接时调用 string_element:

Toast.makeText(SelectionActivity.this, 
           (getString(R.string.error_onCanceled) + " " mLastError.getMessage()),  
            Toast.LENGTH_SHORT).show();

@CommonsWare 完全正确

Toast.makeText是重载方法

您可以从字符串创建 toast:

/**
 * Make a standard toast that just contains a text view.
 *
 * @param context  The context to use.  Usually your {@link android.app.Application}
 *                 or {@link android.app.Activity} object.
 * @param text     The text to show.  Can be formatted text.
 * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
 *                 {@link #LENGTH_LONG}
 *
 */
public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
    return makeText(context, null, text, duration);
}

或资源 ID:

/**
 * Make a standard toast that just contains a text view with the text from a resource.
 *
 * @param context  The context to use.  Usually your {@link android.app.Application}
 *                 or {@link android.app.Activity} object.
 * @param resId    The resource id of the string resource to use.  Can be formatted text.
 * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
 *                 {@link #LENGTH_LONG}
 *
 * @throws Resources.NotFoundException if the resource can't be found.
 */
public static Toast makeText(Context context, @StringRes int resId, @Duration int duration)
                            throws Resources.NotFoundException {
    return makeText(context, context.getResources().getText(resId), duration);
}

你不小心把它们混在一起了