8

私はJavaの初心者で、以下のコードを使用して、クリックされたときに特定のクラスを呼び出すクリック可能なTextViewのリストを表示しました。

サッカーチーム名の一覧です。

例えば。

アーセナル マンチェスター・ユナイテッド チェルシー

TextView Arsenal (TextView id = ars) をクリックすると、ars.class が呼び出されます TextView Chelsea (TextView id = che) をクリックすると、che.class が呼び出されます

私は20以上のフットボールチームの名前を持っています.

テキストビュー ID の配列があり、ループしてクリック可能なアクションを割り当てます。これはうまくいきます。

チーム名の文字列配列があり、コードは文字列配列をループし、Intent() メソッドで使用される Class オブジェクトに各チーム名を割り当てます。

このコードを実行すると、リストが生成されますが、チーム名をクリックすると、文字列配列の最後の位置である Wol.java が常に開きます。

Arsenal をクリックすると 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();
        }
    }
    ;
}
4

2 に答える 2

5

classname内の foreach ループを反復するたびに上書きされますsetTeamNames()。したがって、最後のクラス名だけが最後に残ります。

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();
        }
    });
}
;
于 2012-05-15T16:44:51.513 に答える
1

開始しようとしているアクティビティのレイアウトと機能は似ている (または同じ) が、各チームに固有の異なるデータが表示されると仮定して、次のことを試してください。

次のようにメソッドを変更します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をマニフェストに登録するだけで、準備完了です。

于 2012-05-15T17:30:48.100 に答える