我无法弄清楚如何使用sting作为对象名称。让我解释。我有一个动态分配的图像,我标记。我将该标记作为字符串,并且我有一个与标记同名的存储字符串(定义)。我不能使用与sting名称相同的标签来设置SetText()。这是我想要实现的目标:
public void ShowDefinition(ImageView v){
String str=(String) v.getTag();
setContentView(R.layout.ditionary);
TextView t = (TextView)findViewById(R.id.definition);
if(str == "def1")
t.setText(R.string.def1);
if(str == "def2")
t.setText(R.string.def2)
}
if语句是我想以更简单的方式做的事情。字符串str是从标签中拉出的字符串。正如你所看到的,android资源字符串具有相同的名称,但我无法想出在setText参数中使用str的任何方法。有任何想法吗?
答案 0 :(得分:5)
使用Resources.getIdentifier(...)按名称查找资源ID。
public void ShowDefinition(ImageView v) {
String str=(String) v.getTag();
setContentView(R.layout.ditionary);
TextView t = (TextView)findViewById(R.id.definition);
t.setText(getResources().getIdentifier(str, "string", "com.your.package.name"));
将com.your.package.name
替换为您应用的套餐名称。
答案 1 :(得分:2)
str.equals("def1");
您应该使用equals
。
您可以通过..
访问您的字符串String def1String = getResources().getString(R.string.def1);
t.setText(def1String);
getResources()是关于上下文或活动的方法。
答案 2 :(得分:0)
使用equals
方法:
if(str.equals("def1"))
...
或使用switch case(如果你有java 7)
switch(str) {
case "def1":
...
break;
}
答案 3 :(得分:0)
我从您在代码示例中看到的内容猜测您的数据类型,但看起来您需要使用HashMap<String, Text>
将String
与{{1}相关联你正在Text
设置的(是另一个String
?)。这简化了你的if / else条件,更具动态性,并且因为它是散列的,所以性能更高。
我不确定您的示例中setText()
和R.string.def1
的来源,但是您在开始时将它们加载到R.string.def2
中:
HashMap
检索时,您可以这样查看:
Map<String, Text> strToText = new HashMap<String, Text>();
strToText.put("def1", R.string.def1);
strToText.put("def2", R.string.def2);
您也可以执行t.setText(strToText.get(str));
本身为R.string
而不是将其复制的内容(如果您有访问权限,则更改它......看起来可能是某些Android库)。您可能还需要考虑使用Java反射来执行查找和/或初始化地图,这样您就不必在每次defs更改时都更改代码。