0

私はループで OnTouchListeners を作成しています:

for(int i = 0; i < buttons.length; i++){
        for(int j = 0; j < buttons[i].length; j++ ){
            String buttonID = "button" + i + j;
            int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
            buttons[i][j] = (Button) findViewById(resID);
            buttons[i][j].setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    if (arg1.getAction() == MotionEvent.ACTION_DOWN){
                        socket.emit("button down", "button" + i + j);
                        return false;
                    }
                    if (arg1.getAction() == MotionEvent.ACTION_UP){
                        socket.emit("button up", "button" + i + j);
                        return false;
                    }
                    return true;
                }
            });
        }
    }

setOnTouchListener 関数内で変数 i および j にアクセスするにはどうすればよいですか。それらはループ変数であるため、final と宣言することはできません。別の方法は何ですか。

4

2 に答える 2

2
for(int i = 0; i < buttons.length; i++){
        final int iNow = i;
        for(int j = 0; j < buttons[i].length; j++ ){
            final int jNow = j;
            String buttonID = "button" + i + j;
            int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
            buttons[i][j] = (Button) findViewById(resID);
            buttons[i][j].setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    if (arg1.getAction() == MotionEvent.ACTION_DOWN){
                        socket.emit("button down", "button" + iNow + jNow);
                        return false;
                    }
                    if (arg1.getAction() == MotionEvent.ACTION_UP){
                        socket.emit("button up", "button" + iNow + jNow);
                        return false;
                    }
                    return true;
                }
            });
        }
    }
于 2015-05-29T03:48:46.400 に答える
0

ループ内で現在のボタンのIDを取得するだけで済みました。

for(int i = 0; i < buttons.length; i++){
        for(int j = 0; j < buttons[i].length; j++ ){
            String buttonID = "button" + i + j;
            int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
            buttons[i][j] = (Button) findViewById(resID);
            buttons[i][j].setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    if (arg1.getAction() == MotionEvent.ACTION_DOWN){
                        socket.emit("button down", getResources().getResourceEntryName(arg0.getId()));
                        return false;
                    }
                    if (arg1.getAction() == MotionEvent.ACTION_UP){
                        socket.emit("button up", getResources().getResourceEntryName(arg0.getId()));
                        return false;
                    }
                    return true;
                }
            });
        }
    }
于 2015-05-29T23:36:21.903 に答える