Programing

Android : 루프에서 문자열 /과 함께 findViewById () 사용

crosscheck 2020. 12. 8. 07:44
반응형

Android : 루프에서 문자열 /과 함께 findViewById () 사용


저는 각각 특정 콜백이있는 수백 개의 버튼으로 구성된 뷰가있는 Android 애플리케이션을 만들고 있습니다. 이제는 각 버튼에 대해 수백 줄의 코드를 작성하는 대신 루프를 사용하여 이러한 콜백을 설정하고 싶습니다.

내 질문은 : 정적으로 각 버튼 ID를 입력하지 않고도 findViewById를 어떻게 사용할 수 있습니까? 내가하고 싶은 것은 다음과 같습니다.

    for(int i=0; i<some_value; i++) {
       for(int j=0; j<some_other_value; j++) {
        String buttonID = "btn" + i + "-" + j;
        buttons[i][j] = ((Button) findViewById(R.id.buttonID));
        buttons[i][j].setOnClickListener(this);
       }
    }

미리 감사드립니다!


당신은 사용해야합니다 getIdentifier()

for(int i=0; i<some_value; i++) {
   for(int j=0; j<some_other_value; j++) {
    String buttonID = "btn" + i + "-" + j;
    int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
    buttons[i][j] = ((Button) findViewById(resID));
    buttons[i][j].setOnClickListener(this);
   }
}

모든 버튼 ID를 보유하는 int []를 만든 다음이를 반복 할 수 있습니다.

int[] buttonIDs = new int[] {R.id.button1ID, R.id.button2ID, R.id.button3ID, ... }

for(int i=0; i<buttonIDs.length; i++) {
    Button b = (Button) findViewById(buttonIDs[i]);
    b.setOnClickListener(this);
}

다음 답변을 살펴보십시오.


액세스하려면 태그를 사용할 수 있습니다.

onClick

int i=Integer.parseInt(v.getTag);

그러나 이와 같은 버튼에 액세스 할 수 없습니다.

프로그래밍 방식으로 버튼 생성

으로 Button b=new Button(this);


아래에 표시된 것처럼 Xml이 아닌 Java 코드로 사용자 정의 버튼을 만듭니다.

Button bs_text[]= new Button[some_value];

    for(int z=0;z<some_value;z++)
        {
            try
            {

            bs_text[z]   =  (Button) new Button(this);

            }
            catch(ArrayIndexOutOfBoundsException e)
            {
                Log.d("ArrayIndexOutOfBoundsException",e.toString());
            }
        }

최상위보기에 해당 단추보기 만 자식으로있는 경우 다음을 수행 할 수 있습니다.

for (int i = 0 ; i < yourView.getChildCount(); i++) {
    Button b = (Button) yourView.getChildAt(i);
    b.setOnClickListener(xxxx);
}

더 많은 뷰가있는 경우 선택한 뷰가 버튼 중 하나인지 확인해야합니다.


어떤 이유로 getIdentifier()기능을 사용할 수 없거나 가능한 ID를 미리 알고있는 경우 스위치를 사용할 수 있습니다.

int id = 0;

switch(name) {
    case "x":
        id = R.id.x;
        break;
    etc.etc.
}

String value = findViewById(id);

참고 URL : https://stackoverflow.com/questions/4865244/android-using-findviewbyid-with-a-string-in-a-loop

반응형