最初のアクティビティでレベルを選択し、2番目のアクティビティで実際のパズルを使用してAndroidパズルゲームを作成しようとしています。最初のアクティビティは、2番目のアクティビティが適切な情報をロードできるように、2番目のアクティビティに選択されたパズル番号に関する情報を提供する必要があります。これは、コードをクリーンアップしてボタンを配列に配置しようとするまでは正常に機能していました。
例えば、
私は以前持っていました:
puzzle0 = (Button) findViewById(R.id.puzzle0);
puzzle1 = (Button) findViewById(R.id.puzzle1);
puzzle2 = (Button) findViewById(R.id.puzzle2);
puzzle0.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Puzzle.class);
intent.putExtra("LevelNumber", "0");
startActivityForResult(intent, 0);
}
});
puzzle1.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Puzzle.class);
intent.putExtra("LevelNumber", "1");
startActivityForResult(intent, 1);
}
});
puzzle2.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Puzzle.class);
intent.putExtra("LevelNumber", "2");
startActivityForResult(intent, 2);
}
});
上記のコードはうまく機能し、2番目のパズルアクティビティで正しい情報を取得し、適切なパズルをロードすることができました。
私はさらに多くのパズルを開発したので、forループを使用してこれを少し自動化するのが適切だと思われます。
private void initializePuzzleButtons() {
for(int i = 0; i < numberOfPuzzles; i++)
{
Log.i("Trial","A" + i);
int puzzleButtonID = getResources().getIdentifier("puzzle" + i, "button", this.getPackageName());
Log.i("Trial","B" + i);
puzzleButtons[i] = (Button) findViewById(puzzleButtonID);
Log.i("Trial","C" + i);
final int j = i;
Log.i("Trial","D" + i);
}
for(int i = 0; i < numberOfPuzzles; i++)
{
final int j = i;
puzzleButtons[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Puzzle.class);
Log.i("Trial","E" + j);
intent.putExtra("LevelNumber", j + "");
Log.i("Trial","F" + j);
startActivityForResult(intent, j);
}
});
}
}
LogCatのLogコマンドは、2番目のforループでNullPointerExceptionがスローされていることを示しています。つまり、LogCatはA1、B1、C1 ...、A2、B2、C3、...をD6まで表示し(注:numberOfPuzzles = 7)、例外がスローされます。
j変数を使用する私の理論的根拠は、Eclipseが示すように、「jが最終ではありません。
j変数が問題の原因であると思いましたが、各jをリテラル0に置き換えても、NullPointerExceptionが発生しました
あれは、
for(int i = 0; i < numberOfPuzzles; i++)
{
final int j = i;
puzzleButtons[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Puzzle.class);
Log.i("Trial","E" + 0);
intent.putExtra("LevelNumber", 0 + "");
Log.i("Trial","F" + 0);
startActivityForResult(intent, 0);
}
});
}
}
それでもNullPointerExceptionが発生します。私はここで簡単な何かを見逃しているかもしれませんが、私は何時間も頭を悩ませてきました。私は同様のジレンマで他の人を見ましたが、私が見つけたすべての応答は、サブアクティビティに追加を送信する必要がなく、許可できるため、setOnClickListenerの引数として「NewView.OnClickListener」を使用しません(「this」を使用します)。 OnClickListenerを実装するアクティビティ。アクティビティは一般的にOnClickListenerしか実装できず、各ボタンに特定の文字列を関連付ける必要があるため(putExtraコマンドを使用)、これは私の場合は機能しません。
どんな助けでも大歓迎です!