1

最初のアクティビティでレベルを選択し、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コマンドを使用)、これは私の場合は機能しません。

どんな助けでも大歓迎です!

4

3 に答える 3

1

交換

int puzzleButtonID = getResources().getIdentifier("puzzle" + i, "button", this.getPackageName());

int puzzleButtonID = getResources().getIdentifier("puzzle" + i, "id", this.getPackageName());
于 2012-06-21T05:57:13.063 に答える
1

同様の機能を持つ複数のボタンがある場合。ボタンごとに匿名リスナーを作成するのではなく、アクティビティにOnClickListenerを実装することをお勧めします。

クリックされたボタンを区別するには、2つの方法があります。1.ボタンを初期化するときに、メソッドを使用してタグ付きのボタンを設定できますView.setTag()

  1. resIDを使用します。

あなたの場合、ボタンがクリックされたときにレベルをインテントに渡す必要があるため、方法1を使用することをお勧めします。ボタンを初期化するときは、ボタンタグにレベル値を設定するだけです。

次に、コードは次のようになります。

public class YourActivity extends Activity implements OnClickListener  {

    private void initializePuzzleButtons() {
        ...
        puzzleButtons[i].setOnClickListener(this);
        puzzleButtons[i].setTag(i);
        ...
    }

    @Override
    public void onClick(View view) {
        int level = (int)view.getTag(); 
        ...
    }
}
于 2012-06-21T05:58:25.290 に答える
0

リンクごとに使うべきだと思います

int id = getResources()。getIdentifier( "name_of_resource"、 "id"、getPackageName());

于 2012-06-21T05:57:46.307 に答える