마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드에서 일정시간 버튼 안 눌리도록 하는 방법 있나요?

+1 추천

앱을 만들고 있는데요
오른쪽과 왼쪽에 각각 3개의 버튼이 있습니다.
미션에따라 오른쪽 왼쪽 버튼 한개씩 클릭하면 되는 게임인데

예를들면 오른쪽 버튼을 클릭하고나서 왼쪽 버튼을 클릭하고 
다시한번 오른쪽 버튼을 클릭하면
표시는 나지않다가 다음단계로 넘어가면 한번더 눌렸던 오른쪽 버튼이 계속해서 눌려있게 됩니다..

분명 한쪽 버튼 3개 중에 한개가 클릭되면 전부 다시 클릭이 안되도록 버튼.setEnable을 false로 해두었다가
다음단계로 넘어가면 다시 true로 바꾸어 주었는데도 전에 눌린계 계속 눌린채로 남습니다..

어떻게 해결해야 하나요..??
ㅠㅠ이것때문에 어제 12시간을 매달렸는데 해내지 못했습니다..
도와주세요ㅠㅠ

2년전에도 같은 문제로 고민하다가...결국 해결하지 못하고 그만둔 적이 있는데 이번에는 해내고 싶습니다...

코드는 올리려 했는데...글자수 때문에 못올리네요..ㅠㅠ

 

부탁드립니다!!!!!!감사합니다!!

 

으아아ㅏ아ㅏ (220 포인트) 님이 2014년 3월 6일 질문
질문에 올리지 못한 코드입니다........
너무 길고 여러 테스트를 해보느라 지저분한 코드지만... 한번 봐주세요..

public class StartGame extends Activity implements OnClickListener,
        OnTouchListener, Runnable {

    Thread thread;

    TextView score;
    private int time = 1000;

    boolean isRun = false;
    Dialog dialog;

    int level = 0;
    int rtouchBtn = 0;
    int ltouchBtn = 0;

    ProgressBar progress;
    ImageButton leftBtn[] = new ImageButton[3];
    ImageButton rightBtn[] = new ImageButton[3];

    int left[] = new int[] { R.drawable.l_r, R.drawable.l_r2, R.drawable.l_s,
            R.drawable.l_s2, R.drawable.l_p };

    int leftp[] = new int[] { R.drawable.l_r_p, R.drawable.l_r2_p,
            R.drawable.l_s_p, R.drawable.l_s2_p, R.drawable.l_p_p };

    int right[] = new int[] { R.drawable.r_r, R.drawable.r_r2, R.drawable.r_s,
            R.drawable.r_s2, R.drawable.r_p, };

    int rightp[] = new int[] { R.drawable.r_r_p, R.drawable.r_r2_p,
            R.drawable.r_s_p, R.drawable.r_s2_p, R.drawable.r_p_p };

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.start_game);

        init();
        isRun = true;
        level = 1;
        rtouchBtn = 0;
        ltouchBtn = 0;
        thread = new Thread(this);
        thread.start();

    }

    private void init() {

        leftBtn[0] = (ImageButton) findViewById(R.id.ImageButton1);
        leftBtn[1] = (ImageButton) findViewById(R.id.ImageButton2);
        leftBtn[2] = (ImageButton) findViewById(R.id.ImageButton3);
        rightBtn[0] = (ImageButton) findViewById(R.id.ImageButton4);
        rightBtn[1] = (ImageButton) findViewById(R.id.ImageButton5);
        rightBtn[2] = (ImageButton) findViewById(R.id.ImageButton6);

        for (int i = 0; i < 3; i++) {
            leftBtn[i].setOnClickListener(this);
            rightBtn[i].setOnClickListener(this);
            leftBtn[i].setOnTouchListener(this);
            rightBtn[i].setOnTouchListener(this);
        }

        progress = (ProgressBar) findViewById(R.id.progressBar1);

    }

    @Override
    public void run() {

        Looper.prepare();

        while (isRun) {
            testStart();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void newMission() {
        int l1 = 0, l2 = 0, l3 = 0;
        int r1 = 0, r2 = 0, r3 = 0;
        if (level == 1) {
            l1 = 0;
            l2 = 2;
            l3 = 4;
            r1 = 0;
            r2 = 2;
            r3 = 4;
        }
        leftBtn[0].setImageResource(left[l1]);
        leftBtn[1].setImageResource(left[l2]);
        leftBtn[2].setImageResource(left[l3]);
        rightBtn[0].setImageResource(right[l1]);
        rightBtn[1].setImageResource(right[l2]);
        rightBtn[2].setImageResource(right[l3]);

        for (int i = 0; i < 3; i++) {
            leftBtn[i].setEnabled(true);
            rightBtn[i].setEnabled(true);
        }

    }

    public void testStart() {

        if (time == 0) {

            dialogSet();
            Looper.loop();

        } else {
            time -= 10;
            publishProgress();
            Log.i("time after update: ", time + "");
        }

    }

    protected void publishProgress() {

        progress.setProgress(time);

    }

    @Override
    public void onClick(View v) {
        Log.i("Test!!!!!!!!!!",
                "again!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        int l1 = 0, l2 = 0, l3 = 0;
        int r1 = 0, r2 = 0, r3 = 0;
        if (level == 1) {
            l1 = 0;
            l2 = 2;
            l3 = 4;
            r1 = 0;
            r2 = 2;
            r3 = 4;
        }
        if (ltouchBtn < 1 && v == leftBtn[0] || v == leftBtn[1]
                || v == leftBtn[2]) {
            if (v == leftBtn[0]) {
                ltouchBtn++;
                leftBtn[0].setImageResource(leftp[l1]);
            } else if (v == leftBtn[1]) {
                ltouchBtn++;
                leftBtn[1].setImageResource(leftp[l2]);
            } else if (v == leftBtn[2]) {
                ltouchBtn++;
                leftBtn[2].setImageResource(leftp[l3]);
            }
            for (int i = 0; i < 3; i++) {
                leftBtn[i].setClickable(true);
            }
        }
        Log.i("Test!!!!!!!!!!", String.valueOf(rtouchBtn));
        if (rtouchBtn < 1 && v == rightBtn[0] || v == rightBtn[1]
                || v == rightBtn[2]) {
            Log.i("Test!!!!!!!!!!",
                    "OKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK");
            if (v == rightBtn[0]) {
                rtouchBtn++;
                rightBtn[0].setImageResource(rightp[r1]);
            } else if (v == rightBtn[1]) {
                rtouchBtn++;
                rightBtn[1].setImageResource(rightp[r2]);
            } else if (v == rightBtn[2]) {
                rtouchBtn++;
                rightBtn[2].setImageResource(rightp[r3]);
            } else {

            }
            for (int i = 0; i < 3; i++) {
                leftBtn[i].setClickable(true);
            }
        }
        if (ltouchBtn == 1 && rtouchBtn == 1) {

            Toast.makeText(StartGame.this,
                    String.valueOf(rtouchBtn + ltouchBtn), 1000).show();
            for (int i = 0; i < 3; i++) {
                leftBtn[i].setEnabled(false);
                rightBtn[i].setEnabled(false);
            }

            try {
                thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block e.printStackTrace();
            }

            rtouchBtn = 0;
            ltouchBtn = 0;

            newMission();

        }
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int l1 = 0, l2 = 0, l3 = 0;
        int r1 = 0, r2 = 0, r3 = 0;
        if (level == 1) {
            l1 = 0;
            l2 = 2;
            l3 = 4;
            r1 = 0;
            r2 = 2;
            r3 = 4;
        }
        if (ltouchBtn < 1) {
            if (v == leftBtn[0]) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) // 버튼을 누르고 있을
                                                                    // 때
                    leftBtn[0].setImageResource(leftp[l1]);
                if (event.getAction() == MotionEvent.ACTION_UP) { // 버튼에서 손을 떼었을
                                                                    // 때
                    leftBtn[0].setImageResource(left[l1]);
                }
            } else if (v == leftBtn[1]) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) // 버튼을 누르고 있을
                                                                    // 때
                    leftBtn[1].setImageResource(leftp[l2]);
                if (event.getAction() == MotionEvent.ACTION_UP) { // 버튼에서 손을 떼었을
                                                                    // 때
                    leftBtn[1].setImageResource(left[l2]);
                }
            } else if (v == leftBtn[2]) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) // 버튼을 누르고 있을
                                                                    // 때
                    leftBtn[2].setImageResource(leftp[l3]);
                if (event.getAction() == MotionEvent.ACTION_UP) { // 버튼에서 손을 떼었을
                                                                    // 때
                    leftBtn[2].setImageResource(left[l3]);
                }
            }
        }
        if (rtouchBtn < 1) {
            if (v == rightBtn[0]) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) // 버튼을 누르고 있을
                                                                    // 때
                    rightBtn[0].setImageResource(rightp[r1]);
                if (event.getAction() == MotionEvent.ACTION_UP) { // 버튼에서 손을 떼었을
                                                                    // 때
                    rightBtn[0].setImageResource(right[r1]);
                }
            } else if (v == rightBtn[1]) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) // 버튼을 누르고 있을
                                                                    // 때
                    rightBtn[1].setImageResource(rightp[r2]);
                if (event.getAction() == MotionEvent.ACTION_UP) { // 버튼에서 손을 떼었을
                                                                    // 때
                    rightBtn[1].setImageResource(right[r2]);
                }
            } else if (v == rightBtn[2]) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) // 버튼을 누르고 있을
                                                                    // 때
                    rightBtn[2].setImageResource(rightp[r3]);
                if (event.getAction() == MotionEvent.ACTION_UP) { // 버튼에서 손을 떼었을
                                                                    // 때
                    rightBtn[2].setImageResource(right[r3]);
                }
            } else {

            }
        }

        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    private void dialogSet() {
        dialog = new Dialog(this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.getWindow().setBackgroundDrawable(
                new ColorDrawable(android.graphics.Color.TRANSPARENT));
        dialog.setContentView(R.layout.gameover);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);
        score = (TextView) dialog.findViewById(R.id.score);
        score.setTextColor(android.graphics.Color.BLACK);
        Button okBtn = (Button) dialog.findViewById(R.id.cenbtnov);
        okBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                dialog.cancel();
                finish();
            }
        });

        dialog.show();

    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

}

1개의 답변

0 추천

으앙.. 눈아펑 ㅠㅠ 나도 소스를 보기 어렵게 뙇!! 갖다붙여버리고 싶은 충동이 들었지만.. 참음

2가지 오류를 범하셨어요

첫번째는 enabled 속성과 clickable 의 차이를 잘 모르고 사용하신거고,

    private void newMission() {
        for (int i = 0; i < 3; i++) {        
            leftBtn[i].setEnabled(true);
            rightBtn[i].setEnabled(true);
            leftBtn[i].setClickable(true);
            rightBtn[i].setClickable(true);
        }

    }

 

두번째는 오타가 있네요.

        @Override
    public void onClick(View v) {
         // 왼쪽 버튼 눌리면,
        if (ltouchBtn < 1 && v == leftBtn[0] || v == leftBtn[1] || v == leftBtn[2])
        {
         ltouchBtn++;
       
         for (int i = 0; i < 3; i++)
         {
          // 왼쪽 버튼 클릭 불가능하도록 변경
          leftBtn[i].setClickable(false);
         }
     }
   
        // 오른쪽 버튼 눌리면,
        if (rtouchBtn < 1 && v == rightBtn[0] || v == rightBtn[1] || v == rightBtn[2])
        {
         rtouchBtn++;
            
            for (int i = 0; i < 3; i++)
            {
             // 오른쪽 버튼 클릭 가능하도록 변경
//                leftBtn[i].setClickable(false);

// 오른쪽의 경우인데 왼쪽버튼의 클릭을 못하도록 막으셧음. 아래와 같이 변경
             rightBtn[i].setClickable(false);

// true 가 아니고 false 를 줘야해요
            }
            Log.i("오른쪽 버튼 눌리면", "");
            Toast.makeText(this, "오른쪽", Toast.LENGTH_SHORT).show();
        }
       
        // 둘다 한번씩 눌렸을 경우,
        if (ltouchBtn == 1 && rtouchBtn == 1)
        {
         // 왼쪽 버튼, 오른쪽 버튼 접근 불가상태로 변경
            for (int i = 0; i < 3; i++)
            {
                leftBtn[i].setEnabled(false);
                rightBtn[i].setEnabled(false);
            }

            rtouchBtn = 0;
            ltouchBtn = 0;

                newMission();
        }
    }
}

 

컨트롤 씨비 할때는 항상 주의하시길 바람~ 좋은 하루 되세욧!

초보개발자ㅠ (33,870 포인트) 님이 2014년 3월 6일 답변
초보개발자ㅠ님이 2014년 3월 6일 수정
ㅠㅠ눈아픈코드도 봐주시다니 감사합니다.....
하지만 여전히.....계속 같은 현상이 일어나요...
첫번째
  leftBtn[i].setClickable(true);
            rightBtn[i].setClickable(true);
추가하시고

두번째
rightBtn[i].setClickable(false); 이렇게 변경했는데

같은현상이 발생하나요?
아하 ㅎㅎㅎ 또 바뀐게 있는데 깜빡했네요..
글쓴님은 분명 한쪽 버튼 3개 중에 한개가 클릭되면 전부 다시 클릭이 안되도록 버튼.setEnable을 false로 해두었다가
다음단계로 넘어가면 다시 true로 바꾸어 주었는데도 전에 눌린계 계속 눌린채로 남습니다.. 라고 하셨는데 소스올리신거 보면 true로 되있어요 ㅎㅎ 아래와 같이 변경!


왼쪽 버튼이 눌렸을 경우,
기존 클릭에이블 true 엿던걸 false 로 줫어요
leftBtn[i].setClickable(false);
오른쪽도 마찬가지
기존 클릭에이블 true 엿던걸 false 로 줫어요
rightBtn[i].setClickable(false);
...