정리 멤버변수 Button[] btns= new Button[25]; 도 가능하다. 중복값 가지지 않는 코드
for(int i=0; i<btns.length; i++){
public void clickbtn(View v){ //onclick의 규칙 : public 일 것, return타입은 void일 것, 파라미터가 무조건 1개 있어야함. - view타입 Button btn = (Button)v;
btn.setBackgroundColor(Color.TRANSPARENT); //버튼배경화면 투명하게 |
package com.tistory.firewallgogo.mp02oneto25;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
TextView tv;
Button btn_retry;
Button[] btns= new Button[25]; //Button참조변수가 25개짜리인 배열객체. (버튼이 25개 만들어진 것은 아님)
//현재 눌러야할 번호
int number=1; //빨간색번호
//버튼 배경그림객체 참조변수
Drawable backDrawble; //가끔식 빨간색이 뜨는 이유는 import 자동완성안하고 끝까지 써서.
//이 부분은 배우지 않아 pass하기로 함.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=findViewById(R.id.tv);
btn_retry=findViewById(R.id.btn_retry); //각각의 참조변수를 우선 onCreate에 넣자.
Random rnd = new Random();
//중복되지 않는 랜덤값 25개를 가진 배열 - //중복값 가지지 않는 코드
int[] arr = new int[25];
for(int i=0; i<25; i++){
arr[i] = rnd.nextInt(25)+1;//1-25
for(int k=0; k<i; k++){
if(arr[i]==arr[k]){
i--;
break;
}}}
//Button 참조변수들에게 Button 객체들 대입하기
for(int i=0; i<btns.length; i++){
btns[i]=findViewById(R.id.btn01+i);//btn0i는 불가능함. 변수명이니까. 대신에 +i이 가능함.
btns[i].setText(arr[i]+""); // +""추가해서 문자열로 만들기
//btns[i].setTag(arr[i]+""); //<--- 번호를 넣는 방법임.
}
//버튼의 배경이미지 얻어오기
backDrawble = btns[0].getBackground();
}//onCreate Method..
//xml에 onclick ="clickbtn"를 만듦.
//onClick속성에 지정한 callback 메소드
//onclick속성으로 지정한 메소드가 자동 실행됨
public void clickbtn(View v){ //onclick의 규칙 : public 일 것, return타입은 void일 것, 파라미터가 무조건 1개 있어야함. - view타입
//매개변수로 전달된 View v가 현재 클릭한 뷰(버튼)
//버튼 누른 녀석이 v라는 뜻
//클릭된 버튼의 글씨를 얻어오기
Button btn = (Button)v; //다운캐스팅(자식->부모 가르키는 상황) - v가 버튼임을 인지함.
String s = btn.getText().toString(); //잠시 // 함 문자열 - String, 케릭시퀀스 .toString을 쓰면 케릭씨퀀스-->String으로 바뀜. // 캐릭시퀀스가 상위라서 .toString으로 써야함
//버튼에 기록된 tag값을 얻어오기
//String s = btn.getTag().toString(); //getTag()는 obejct이기때문에 이게 알아들으려면 .toString으로 해야함.
//얻어온 글씨를 int형으로 변환
int n = Integer.parseInt(s);
//얻어온 글씨와 현재 누를 번호(number)와 같은지 비교
if(number == n){
//눌러야할 번호를 잘 눌렀다라는 의미
btn.setText("OK"); //버튼의 글씨변경
btn.setBackgroundColor(Color.TRANSPARENT);
btn.setTextColor(0x88FF0000); //XML이 아니기 때문에 자바 16진수는 0x 영엑스 , ARGB이기 때문에
//버튼을 안보이도록 하려면..visible -> invisible
btn.setVisibility(View.INVISIBLE);
//눌러야 번호를 증가
number++;
if(number>25){
tv.setText("축하합니다 끝났습니다.");
btn_retry.setEnabled(true);
}
else{
tv.setText(number+"");
}
}
}//clickbtn
//여기는 retry부분임. - 아직 안 배우는 것들이 많다.
//retry버튼에 지정된 onclick속성 콜백메소드
public void clickretry(View v){
Random rnd = new Random();
//중복검사 -
int[] arr =new int[25];
for(int i=0; i<arr.length; i++){
arr[i]=rnd.nextInt(25)+1;
for(int k=0; k<i; k++){
if(arr[i]==arr[k]){
i--;
break;
}}}
//다시 새롭게 숫자 넣는 방식, 숫자는 다시 검은색으로.
for(int i=0; i<btns.length; i++){
btns[i].setText(arr[i]+"");
//btns[i].setTag(arr[i]);
btns[i].setTextColor(Color.BLACK);
btns[i].setBackground(backDrawble);
}
number=1;
tv.setText(number+"");
btn_retry.setEnabled(false);
}
}//main class