Android:遍历字符串数组 - 意图方法的逻辑需要帮助
Posted
技术标签:
【中文标题】Android:遍历字符串数组 - 意图方法的逻辑需要帮助【英文标题】:Android: Looping through a string array - help needed on logic for intent method 【发布时间】:2012-05-23 05:30:40 【问题描述】:我是一个 java 新手,我使用下面的代码来显示一个可点击的 TextView 列表,这些 TextView 在被点击时会调用特定的类。
这是一个足球队名称的列表。
例如。
阿森纳 曼联 切尔西
点击 TextView Arsenal (TextView id = ars) 会调用 ars.class 点击TextView Chelsea(TextView id = che)会调用che.class
我有 20 多个足球队的名字。
我有一个 textview id 数组,我循环遍历它们并为它们分配一个可点击的操作。这很好用。
我有一个团队名称的字符串数组,代码循环遍历字符串数组并将每个团队名称分配给一个 Class 对象,该对象在 Intent() 方法中使用。
当我运行此代码时,会生成列表,但是当我单击团队名称时,它总是会打开 Wol.java,即字符串数组中的最后一个位置。
我需要一些逻辑方面的帮助,这样当我点击阿森纳时,它会打开 ars.class
这里是代码。
public final int[] teams = R.id.ars, R.id.ast, R.id.bir, R.id.bla,
R.id.blp, R.id.bol, R.id.che, R.id.eve, R.id.ful, R.id.hul,
R.id.lee, R.id.liv, R.id.mid, R.id.mnc, R.id.mnu, R.id.nor,
R.id.nwu, R.id.por, R.id.qpr, R.id.sto, R.id.sun, R.id.swa,
R.id.tot, R.id.wes, R.id.wig, R.id.wol ;
//String array of teamnames, named to correspond their class name.
public final String[] teamnames = "ars", "ast", "bir", "bla", "blp",
"bol", "che", "eve", "ful", "hul", "lee", "liv", "mid", "mnc",
"mnu", "nor", "nwu", "por", "qpr", "sto", "sun", "swa", "tot",
"wes", "wig", "wol" ;
TextView tv;
Class classname;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.m_transfers);
setTeamNames(); //Method sets up team names to a Class name.
for (int i = 0; i < teams.length; i++)
tv = (TextView) findViewById(teams[i]);
tv.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
Intent open = new Intent(Transfers.this, classname);
startActivity(open);
);
;
public void setTeamNames()
for (String s : teamnames)
String name = "ttj.android.ft.teams." + s;
try
classname = Class.forName(name);
catch (ClassNotFoundException e)
e.printStackTrace();
;
【问题讨论】:
你是认真地说你已经创建了 20 个不同的活动,每个团队一个?为什么不只使用一个Activity
(例如称为TeamActivity
)并将团队名称作为字符串Extra
传递给您用于Intent
的startActivity(...)
?
对 android 开发非常陌生,我仍然对 Manifest 感兴趣。是的,我在清单中创建了 20 个单独的活动。我可以在清单中创建一个 TeamActivity 吗?
@tiptopjat 您可以在清单中创建一个 TeamActivity,就像创建 20 个不同的活动一样,然后,正如 MisterSquonk 所说,只需在 Intent 中添加一个字符串或 int 来区分。
谢谢大家,我会试一试的。当你说Intent时,你是指xml文件中的Intent-filter还是java中的Intent方法?为菜鸟问题道歉!
@tiptopjat:看我的回答。不,您不需要 TeamActivity
的清单中的 <intent-filter>
,因为您创建了一个明确的 Intent
指定 TeamActivity.class
- 不需要意图过滤器。
【参考方案1】:
每次在setTeamNames()
内的foreach 循环中迭代时,classname
都会被覆盖。因此,只有最后一个类名保留在末尾。
如果teams
和teamnames
具有相同数量的条目(它们应该如此),您可以使用以下代码并完全摆脱setTeamNames()
。
final String prefix = "ttj.android.ft.teams.";
for (int i = 0; i < teams.length; i++)
tv = (TextView) findViewById(teams[i]);
tv.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
try
Class class = Class.forName(prefix + teamnames[i]);
Intent open = new Intent(Transfers.this, class);
startActivity(open);
catch (ClassNotFoundException e)
e.printStackTrace();
);
;
【讨论】:
呃!谢谢图沙尔! :-) 我唯一的问题是第 7 行。 Class class= Class.forName(prefix + teamnames[i]); Eclipse 说我不能在以不同方法定义的内部类中引用非最终变量“i”。 对,我忘了。您要么必须将团队名称和前缀设置为 final,要么在 OnClickListener() 类中声明它们。 感谢您的回复。 'teamnames' 已经是公开决赛了。我尝试在 OnClickListener() 类中声明团队名称。仍然没有快乐。 你是否也将字符串前缀设为final? 太棒了!谢谢!有用。我花了 6 个小时试图解决这个问题,应该早点注册到这个网站。再次感谢。【参考方案2】:假设您尝试启动的活动具有相似(或相同)的布局和功能,但针对每个团队显示不同的数据,请尝试以下操作。
如下更改您的onClick(View v)
方法...
tv.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
Intent open = new Intent(Transfers.this, TeamActivity.class);
open.putExtra("team", ((TextView)v).getText());
startActivity(open);
);
然后创建一个“通用”Activity
...
public class TeamActivity extends Activity
String teamName = "";
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// Set the layout here
// Get the Intent and team name with the following...
teamName = getIntent().getStringExtra("team");
// Do something with teamName
只需在您的清单中注册 TeamActivity
就可以了。
【讨论】:
感谢您分享此解决方案。我想使用这种方法的应用程序会更有效吗?我在我的方法上投入了太多时间,我没有精力从头开始。哈哈。以上是关于Android:遍历字符串数组 - 意图方法的逻辑需要帮助的主要内容,如果未能解决你的问题,请参考以下文章