来自资源字符串的Toast.makeText

4

我有一个名为MyPrimaryClass的类,这个类有一个按钮,当按下时,会创建一个带有myClassForResult类的Intent。

我使用以下代码来启动它:

startActivityForResult(myIntentOfMyClassForResult, ACTIVITY_EDIT_BTEXT);

MyPrimaryClass和myClassForResult都是Activity的扩展类。

所以,当我在myClassForResult中调用Toast.makeText并使用R.string.my_resource_string作为文本参数时,它会弹出“Force Close”错误提示框!

我已经尝试过以下方法:

Context c = myClassForResult.this;
Toast toast = Toast.makeText(c,
    c.getResources().getString(R.string.my_resource_string),
    Toast.LENGTH_SHORT);
toast.show();

还有这个:c = getApplicationContext()

还有这个:c = getBaseContext()

还有这个:

Context c = MyPrimaryClass.this;
Toast toast = Toast.makeText(c,
    R.string.my_resource_string,
    Toast.LENGTH_SHORT);
toast.show();

如果我使用类似于“我的 Toast 文本!”这样的内联字符串,它是有效的。但是我需要从资源中获取一个字符串。
-问题已解决:
为了解决这个问题,我将 Toast 的持续时间改为 Toast.LENGTH_LONG。
字符串 R.string.my_resource_string 的值为“标题为空”。
当我将其值更改为“标题”时,它可以正常工作,所以我想这个字符串对于 Toast.LENGTH_SHORT 持续时间来说太长了。
但是当我将持续时间改为 Toast.LENGTH_LONG 时,我可以使用长字符串。
Context c = MyPrimaryClass.this;
Toast toast = Toast.makeText(c,
    R.string.my_resource_string,
    Toast.LENGTH_LONG);
toast.show();

1
将logcat错误发布到强制关闭上。 - JoxTraex
这是logcat错误:android.content.res.Resources$NotFoundException: 字符串资源ID #0x7f04000a 未找到 - DMF
你能解释一下为什么要这样使用这两个类吗? - JoxTraex
因为一个类是项目列表,而第二个类是用来编辑这些项目的... - DMF
不要在问题正文中写答案,最好创建新答案并接受它 :) - Jin35
抱歉,我无法回答自己的问题,因为我是stackoverflow上的新手,它不允许我这样做。 :) - DMF
4个回答

4

尝试:

Toast.makeText(this, this.getString(R.string.my_resource_string), Toast.LENGTH_SHORT);

1
这个“this”是无效的,因为代码位于“View.OnClickListener”内部。 - DMF
获取 MyPrimaryClass 的引用,并使用 MyPrimaryClass.getString(R.string.my_resources_string)。 - ab11
我做了这个: Context c = MyPrimaryClass.this; 然后 c.getString(R.string.my_resources_string) - DMF
是的,您必须使用一般上下文,而不是这个特定的上下文。 - Muhammed Refaat

4

需要注意的一点:

Toast toast = Toast.makeText(c,
    c.getResources().getString(R.string.my_resource_string),
    Toast.LENGTH_SHORT);
toast.show();

可以简化成:

Toast.makeText(c,
    c.getResources().getString(R.string.my_resource_string),
    Toast.LENGTH_SHORT).show();

这样可以节省不必要的对象引用。

你需要明白的一件事情是,只要你在包中引用了R(而不是android.R.),只要你有Context,就可以访问到你的资源。

更新

在了解了你使用它的目的后,我建议你改变你的方法,虽然这是可行的,但对于如此简单的事情,你的方法并不理想。

当你想要启动一个在你的包之外的应用程序以获取结果时,通常会使用方法startActivityForResult(xx)。

例如:如果我想从产品中检索条形码,那么我将通过操作间接地启动Intent到该条形码类。 然后,我将使用onActivityResult(xx)检索数据。

对于自己的类来说,这样做没有意义


取决于数据。它是什么?@DMF - JoxTraex
为什么你不能在当前类中维护这个整数数组呢?或者将它存储在数据库中,有什么原因吗? - JoxTraex
被调用的次要类创建整数数组,然后将其返回给主类。我不会仅为了解决简单的提示文本问题而创建数据库表。 - DMF
@JoxTraex 看看刚刚发生了什么,我试图从资源中获取的字符串是:R.string.empty_title。我将它更改为任何其他字符串资源,如R.string.testing_title,它就可以工作了! - DMF
为什么不直接在字符串字段中使用R.string.text,这对我有效。 - Muhammed Refaat
显示剩余7条评论

2
@dilipkaklotar回答得很正确,但还需要做一些更改:
这是我的操作步骤。
Toast.makeText(getApplicationContext(),
getApplicationContext().getResources().getString(R.string.message),
Toast.LENGTH_SHORT).show();

getResources没有括号()。 并且结尾是.show();而不是toShow()。

但这是正确的,非常感谢您。


0
Toast.makeText(getApplicationContext(), getApplicationContext().getResources.getString(R.string.imgval), Toast.LENGTH_SHORT).toShow();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接