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 传递给您用于IntentstartActivity(...) 对 android 开发非常陌生,我仍然对 Manifest 感兴趣。是的,我在清单中创建了 20 个单独的活动。我可以在清单中创建一个 TeamActivity 吗? @tiptopjat 您可以在清单中创建一个 TeamActivity,就像创建 20 个不同的活动一样,然后,正如 MisterSquonk 所说,只需在 Intent 中添加一个字符串或 int 来区分。 谢谢大家,我会试一试的。当你说Intent时,你是指xml文件中的Intent-filter还是java中的Intent方法?为菜鸟问题道歉! @tiptopjat:看我的回答。不,您不需要 TeamActivity 的清单中的 &lt;intent-filter&gt;,因为您创建了一个明确的 Intent 指定 TeamActivity.class - 不需要意图过滤器。 【参考方案1】:

每次在setTeamNames() 内的foreach 循环中迭代时,classname 都会被覆盖。因此,只有最后一个类名保留在末尾。

如果teamsteamnames 具有相同数量的条目(它们应该如此),您可以使用以下代码并完全摆脱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:遍历字符串数组 - 意图方法的逻辑需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

C语言 使用指针遍历数组

在清单文件中指定意图操作的正确方法是啥?

PHP 数组遍历方法大全(foreach,list,each)

求jsp json数组遍历方法

js 数组去重方法

jQuery遍历数组与筛选数组的方法