2012-05-15 9 views
7

私は初心者ですが、クリックしたときに特定のクラスを呼び出すクリック可能なTextViewのリストを表示するために以下のコードを使用しました。Android:文字列配列をループする - インテントメソッドのロジックに必要なヘルプ

サッカーのチーム名のリストです。

例:

アーセナルのTextViewアーセナル(TextViewのIDが=のARS)の マンチェスター・ユナイテッド チェルシー

クリックすると、TextViewのチェルシー(TextViewの番号= CHE)に クリックars.class呼び出しますがche.classを呼び出します

I 20以上のサッカーチーム名を持っています。

私はループバックしてクリック可能なアクションを割り当てるtextview idの配列を持っています。これは正常に動作します。

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

このコードを実行するとリストが生成されますが、チーム名をクリックすると、常に文字列配列の最後の位置である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(); 
     } 
    } 
    ; 
} 
+0

あなたは真剣に、各チームに1つずつ、20の異なるアクティビティを作成したとお考えですか?なぜ、 'Activity '(例えば' TeamActivity'と呼ばれる)を持っていて、 'startActivity(...)'に使う 'Intent'の文字列' Extra'としてチーム名を渡すのはなぜですか? – Squonk

+0

非常に新しいアンドロイドの開発、まだマニフェストの周りに私の頭を得ています。はい、私はマニフェストで20の別々のアクティビティを作成しました。マニフェストでTeamActivityを作れますか? – tiptopjat

+0

@tiptopjat MisterSquonkが述べたように、20種類のアクティビティを作成したのと同じように、マニフェストに1つのTeamActivityを作成し、インテントに文字列またはintを追加して区別することができます。 – Tushar

答えて

5

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

もし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(); 
     } 
    }); 
} 
; 
+0

Duh!ありがとうTushar! :-)この問題は、7行目でしかありません。Class class = Class.forName(prefix + teamnames [i]); Eclipseでは、別のメソッドで定義された内部クラスの中で非最終変数 'i'を参照することはできません。 – tiptopjat

+0

そう、忘れてしまった。チーム名と接頭辞をfinalとして設定するか、OnClickListener()クラス内で宣言する必要があります。 – Tushar

+0

返信いただきありがとうございます。 'teamnames'はすでに公開最終です。私はOnClickListener()クラスの中でチーム名を宣言しようとしました。まだ喜びはありません。 – tiptopjat

1

は、同様の(または同じ)レイアウトと機能を持っていますが、各チームに固有の異なるデータを表示するには、次を試してみてください。

次のように続いて '一般的な' 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を登録し、あなたがに良いことがありますを作成...

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); 
    } 
}); 

をごonClick(View v)方法を変更

行く。

+0

このソリューションをご利用いただき、ありがとうございます。私はアプリがこのアプローチを使ってより効率的になると思いますか?私は私のアプローチにとても多くの時間を費やしました。私は最初から始める力はありません。笑。 – tiptopjat

関連する問題