2017-10-25 18 views
1

XML 레이아웃은 EditText이고 맨 위에는 많은 버튼과 다른 뷰가 많이 있습니다. 루트 요소는 ConstraintLayout입니다.ID 배열을 하드 코딩하지 않고 프로그래밍 방식으로 버튼 배열을 가져옵니다. findViewById()를 사용하여 가져 오기

<ConstraintLayout ...> 
    <EditText .../> 

    <!-- Here is the list of buttons --> 
    <!-- For placement constraints purposes, I may have id's in the buttons --> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="A"/> 
    ... <!-- About 26 of them --> 
    <Button .../> 

</ConstraintLayout> 

버튼 ID를 하드 코딩과 findViewById(resId)는 boilerplates 많이 떠나 가장 좋은 방법이 될 것 같지 않습니다.

ActivityName.javaButton[] 배열에있는 많은 버튼을 어떻게 얻을 수 있습니까? 그렇게하는 가장 좋은 방법은 무엇입니까?


편집 : 아래

내가 내 XML에 사용하고있어 하나의 실제 버튼입니다. 프로그래밍 방식으로 단추를 ConstraintLayout에 추가하는 것은 어려울 것이라고 생각합니다. 가능한 경우 프로그래밍 방식으로 공유하십시오.

<Button 
     android:id="@+id/keyboard_button_Q" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:background="@android:color/transparent" 
     android:minWidth="0dp" 
     style="?android:attr/buttonBarButtonStyle" 
     android:padding="0dp" 
     android:text="Q" 
     app:layout_constraintEnd_toStartOf="@id/keyboard_button_W" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 
+1

xml 대신 프로그래밍 방식으로 모든 버튼을 만들 수 있습니다. [프로그래밍 방식으로 레이아웃에 단추 추가] (https://stackoverflow.com/questions/4907609/add-button-to-a-layout-programmatically) – csmckelvey

+0

프로그래밍 방식으로 단추를 추가하는 것에 대한 많은 반응을 얻은 후에 설명을 편집했습니다. 프로그래밍 방식으로 26 개의 버튼을 추가하고 '제한 체인'을 만드는 것은 훨씬 더 복잡 할 것입니다. –

답변

0

Android에서 사용할 수있는 버터 나이프 라이브러리입니다. @BindView로 필드에 주석을 달면 뷰 ID와 버터 나이프가 자동으로 레이아웃의 해당 뷰를 캐스팅합니다. 레이아웃 XML 파일에서 명확한 구조를 유지할 수 있기 때문에 이것은 좋은 접근 방법입니다. 여기

이 프로젝트에 버터 나이프를 포함하려면 앱이

@BindView(R.id.title) TextView title; 
@BindView(R.id.subtitle) TextView subtitle; 
@BindView(R.id.footer) TextView footer; 

에서 사용할 수있는 방법에 대한 예를 들어, 당신은 당신의 응용 프로그램 Gradle을 파일에 종속성을 추가해야합니다.

compile 'com.jakewharton:butterknife:8.8.1' 
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' 

더 많은 정보와 자세한 설치 및 사용 가이드를 들어 당신은 자신의 웹 사이트를 확인할 수 있습니다 http://jakewharton.github.io/butterknife/

+0

빠른 응답을 보내 주셔서 감사합니다. 나는'ButterKnife'를 사용하여 매우 유용하다는 것을 알았습니다. 하지만 여전히 내 코드가 강력하지는 않습니다 (단 하나의 버튼 배열을 만들기 위해 26 줄의 코드를 작성해야합니다). 루프를 26 회 반복하고 배열을 만들어 줄 것을 기대하고있었습니다. –

+1

단추를 프로그래밍 방식으로 만들고 뷰에 추가 할 수 있습니다. 이것이 당신을위한 선택이 될 수 있습니까? –

+0

@RahatZaman 그러면 앞서 언급 한 Android Data Binding Library를 사용해야합니다. –

1

단 하나의 버튼을 포함하는 간단한 button.xml 파일을 만듭니다. 그런 다음 원하는 횟수만큼 버튼 런타임을 빌드하십시오. 이것이 LayoutInflater 클래스입니다.

Button button = (Button) LayoutInflater.from(this).inflate(R.layout.button, null); 
+0

이 항목의 컨텍스트 외부로 이동한다고 생각합니다. 버튼을 ConstraintLayout Chain으로 만듭니다. 'LayoutInflater'를 사용하여 프로그래밍 방식으로 단추를 추가하면 어떻게 할 수 있습니까? 첫 번째 버튼 이후에 프로그래밍 방식으로 추가되는 다른 버튼에 대한 참조가 필요하며 해당 layoutParams를 추가하는 데 필요한 id를 사용해야합니다. Button XML 코드를보고 실제로하고 싶은 것을 알아보십시오. –

+0

@Rahat 어쩌면 올바르게 이해할 수 없지만 상위보기 (ConstraintLayout)에서 컨텍스트를 가져올 수 있습니다. LayoutInflater.from (rootView.getContext()) –

+0

컨텍스트라는 단어가 앱의 '컨텍스트'를 의미하는 것은 아니며,이 질문은 내 질문의 주제가 아닐 수도 있습니다. 내 코드에서 만든 버튼을 사용하여'Constraint Chain'을 만드는 방법은 무엇을 의미합니까? –

1

당신은 android:tag를 사용하여 볼 수있는 번호를 연결할 수 있습니다

안드로이드 : 태그

공급 장치 A 문자열를 포함하는이보기에 대한 태그, 나중에 검색 할 View.getTag() 또는 View.findViewWithTag()으로 검색했습니다. 일반적으로 태그 대신에 android : id 속성을 통해 ID를 사용하는 것이 더 빠르며 컴파일 타임 타입 검사가 가능하기 때문에 ID를 사용하는 것이 좋습니다.

'\;'을 (를) 사용하여 문자열 값이 될 수 있습니다. 유니 코드 문자의 경우 '\ n'또는 '\ uxxxx'와 같은 문자를 이스케이프 처리합니다. 이와

, 당신은 당신의 레이아웃에있는 모든 버튼을 기억할 수 :

<Button 
    android:layout_width="wrap_content" 
    android:tag="0" 
    android:layout_height="wrap_content" 
    android:text="A"/> 

<Button 
    android:layout_width="wrap_content" 
    android:tag="1" 
    android:layout_height="wrap_content" 
    android:text="B"/> 

... 

을 그런 다음 루프 findViewWithTag()하고 모든 버튼을 얻을 수있는 다음의 경우

Button[] buttons = new Button[26]; 

for(int i = 0; i < 26; i++) { 
    buttons[i] = findViewByTag(String.valueOf(i)); 
} 

듣기를 클릭하면 getTag()으로 태그를 확인하여 무엇인가 할 수 있습니다.

buttonClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     int tag = Integer.parseint(v.getTag()); 

     // do something based on the tag. 
    } 
}; 
+0

이것은 내가 원했던 전부입니다. 하지만 id와 getIdentifier를 사용하여 동일한 작업을 수행하는 방법을 발견했습니다. –