카테고리 없음

안드로이드실무9주차 정리

jong133 2026. 4. 28. 16:41
activity_main.xml



    

        
        
    










    
 

레디언트

주어진 activity_main.xml 코드는 세 개 버튼이 가로로 나란히 배치되고, 아래에 FrameLayout 영역에 세 개 TextView가 겹쳐진 구조입니다. 버튼 클릭 시 동일한 onClick 메서드를 호출하게 되어 있습니다.

이 구조에서 의도한 기능은 보통 버튼 클릭에 따라 특정 TextView만 보이도록 하여 내용이 전환되게 하는 것입니다. 하지만 현재 XML만 보았을 때 각 버튼과 TextView가 겹쳐서 모두 보이고, 버튼 안 크기가 모두 match_parent여서 한 줄에 다 담기 어려움과 크기 문제, 클릭 함수 연결은 되어 있지만 실제 동작 정의가 없는 상태입니다.


XML 태그별 핵심 포인트

  • LinearLayout (root) : 수직 배치
  • LinearLayout (내부) : 수평으로 버튼 3개 배치, 각 버튼이 width=match_parent라서 한 줄에 다 나오기 어렵고 겹침 발생
  • Button: backgroundTint, onClick 속성으로 버튼 클릭 이벤트 연결
  • FrameLayout : 겹치는 TextView 3개 배치 (각각 배경색과 텍스트 다름)

제안하는 개선점 및 구상

  1. 버튼을 가로로 동일 영역에 나눠 갖도록 android:layout_width="0dp"와 android:layout_weight="1" 속성 주기 (한 줄에 3개 균등 분배)
  2. FrameLayout 내 TextView는 모두 겹쳐있으므로 기본적으로 첫 번째 텍스트만 보이게 나머지는 android:visibility="gone"으로 숨김 처리
  3. 버튼 클릭 시 버튼별로 보일 TextView를 프래그먼트나 직접적으로 findViewById  setVisibility로 전환 처리하는 onClick 메서드 구현 필요
  4. 텍스트 색상이 지정되어 있지 않은 부분은 필요에 따라 명확하게 지정
  5. 버튼의 높이 match_parent보다는 적절한 dp값 또는 부모의 wrap_content 권장

예시로 간략히 수정한 버튼 부분 XML 일부

xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/button1"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:backgroundTint="#3F51b5"
        android:text="지옥같은시간"
        android:onClick="onClick"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:backgroundTint="#FF9800"
        android:text="구멍이보이기시작"
        android:onClick="onClick" />

    <Button
        android:id="@+id/button3"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:backgroundTint="#009688"
        android:text="최종결전의날이다용사"
        android:onClick="onClick"/>
</LinearLayout>

view1, view2, view3 초기 상태 예시 (view1만 보임, 나머지는 숨김)

xml

<TextView
    android:id="@+id/view1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#3F51B5"
    android:text="@string/body01"
    android:textColor="#92CD4D"
    android:visibility="visible" />

<TextView
    android:id="@+id/view2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFC107"
    android:text="@string/body02"
    android:visibility="gone"/>

<TextView
    android:id="@+id/view3"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#4CAF50"
    android:text="@string/body03"
    android:textColor="#ff0000"
    android:visibility="gone"/>

버튼 클릭 onClick 메서드 예시 (Kotlin 기준)

kotlin

fun onClick(view: View) {
    val view1 = findViewById<TextView>(R.id.view1)
    val view2 = findViewById<TextView>(R.id.view2)
    val view3 = findViewById<TextView>(R.id.view3)

    view1.visibility = View.GONE
    view2.visibility = View.GONE
    view3.visibility = View.GONE

    when(view.id) {
        R.id.button1 -> view1.visibility = View.VISIBLE
        R.id.button2 -> view2.visibility = View.VISIBLE
        R.id.button3 -> view3.visibility = View.VISIBLE
    }
}

이 구조로 하면 버튼 클릭에 따라 화면 중앙의 텍스트 영역이 바뀌면서 각기 다른 배경색과 텍스트 내용을 보여줄 수 있어 사용자 경험도 부드럽고 명확해집니다.

필요하면 버튼과 텍스트 뷰 간 간격, 패딩, 폰트 크기 등도 조절해보면 좋겠어요. 더 개선할 점이나 질문 있으면 편하게 알려줘~ㅎ

 
 
 

오후 4:34

오후 4:35

<resources>
    <string name="app_name">FrameLayoutApplication</string>
    <string name="body01">
        내 윈도우가 망가진지 벌써\n
        한달이 된것 같다\n
        나는 너무 걱정이 된다\n
        그래도 진전들이 계속보인다\n
        나도 용준이처럼 구멍이 보이기 시작했다\n
        용준아 날 위해 기도해주렴\n
        컴퓨터가 잘 고쳐지는 그날까지\n
        난 끝내 고치고 마리라\n

    </string>
    <string name="body02">
        지금까지 물리적으로 망가졌다하면은\n
        이번에 망가진건 물리적인게 아니라\n
        너무나 억까이니라\n
        마이크로소프트를 원망할수밖에\n
        내가 다운그레이드를 연속으로\n
        2 번 3 번 해서 그런가\n
        system파일이 많이 아픈거 같다\n

    </string>
    <string name="body03">
        오늘 결전의 날이다\n
        드디어 컴퓨터를 고칠수 있을거같다\n
        윈도우11의 흔적 하나도 남김없이\n
        delete you win11 youre 암호명\n
        다들 아점저 먹고 와요!\n

    </string>
</resources> 
strings.xml
 

레디언트

현재 요청하신 것은 strings.xml에 들어갈 문자열 리소스 내용을 XML 형식으로 작성하는 것입니다. 주어진 내용을 그대로 잘 태그로 감싸서 XML 구조로 만들어야 해요.


필요한 XML 태그

  • 최상위 루트로 <resources> 태그가 있어야 합니다.
  • 각각의 문자열은 <string name="..."> ... </string> 형태로 감싸야 합니다.
  • 내부 줄바꿈은 \n으로 표시되어 있으니 그대로 넣어주면 됩니다.
  • <string name="app_name"> 항목처럼 앱 이름도 함께 포함되어야 합니다.

최종 답변 구조 및 내용

xml

<resources>
    <string name="app_name">FrameLayoutApplication</string>
    <string name="body01">
내 윈도우가 망가진지 벌써\n
한달이 된것 같다\n
나는 너무 걱정이 된다\n
그래도 진전들이 계속보인다\n
나도 용준이처럼 구멍이 보이기 시작했다\n
용준아 날 위해 기도해주렴\n
컴퓨터가 잘 고쳐지는 그날까지\n
난 끝내 고치고 마리라\n
    </string>
    <string name="body02">
지금까지 물리적으로 망가졌다하면은\n
이번에 망가진건 물리적인게 아니라\n
너무나 억까이니라\n
마이크로소프트를 원망할수밖에\n
내가 다운그레이드를 연속으로\n
2 번 3 번 해서 그런가\n
system파일이 많이 아픈거 같다\n
    </string>
    <string name="body03">
오늘 결전의 날이다\n
드디어 컴퓨터를 고칠수 있을거같다\n
윈도우11의 흔적 하나도 남김없이\n
delete you win11 youre 암호명\n
다들 아점저 먹고 와요!\n
    </string>
</resources>

이렇게 하면 XML 내부에 줄바꿈과 텍스트가 그대로 유지되어 앱에서 @string/body01 등으로 호출했을 때 의도한 대로 텍스트가 표현됩니다.

 


레디언트

주어진 코드는 안드로이드 앱에서 버튼 클릭에 따라 세 개의 텍스트뷰 중 하나만 보이도록 처리하는 MainActivity 클래스입니다. XML 레이아웃과 함께 동작하는 자바 코드라, 전반적인 역할과 흐름을 차근차근 설명할게.


주요 XML 태그와 연결점

  • R.layout.activity_main : 이 액티비티가 사용할 XML 레이아웃 리소스 (예: activity_main.xml)
  • R.id.view1, R.id.view2, R.id.view3 : 각각 세 개의 TextView 아이디
  • R.id.button1, R.id.button2, R.id.button3 : 각각 세 개의 버튼 아이디 (XML에 온클릭 이벤트 연결)

코드 흐름 핵심

  1. onCreate() 메서드:
    • 액티비티가 만들어질 때 호출된다.
    • setContentView(R.layout.activity_main)로 화면 레이아웃을 세팅한다.
    • findViewById()로 레이아웃 안에 정의된 TextView 3개를 각 멤버변수(tv1, tv2, tv3)에 연결한다.
  2. onClick(View view) 메서드:
    • 각 버튼에 사전 지정된 클릭 이벤트 핸들러로 연결되어 있다.
    • 클릭되면 먼저 세 TextView 모두를 INVISIBLE 상태로 숨긴다.
    • 클릭된 버튼 아이디를 확인해, 그에 맞는 TextView만 VISIBLE 상태로 다시 보이게 한다.

동작 결과

  • 화면에는 버튼 3개와 TextView 3개가 중첩되어 있다.
  • 사용자 클릭에 따라 각 버튼이 눌리면 대응하는 텍스트뷰만 보이며 다른 텍스트뷰는 숨겨진다.
  • 즉, 버튼 1 클릭 → 첫 번째 텍스트뷰 보임
  • 버튼 2 클릭 → 두 번째 텍스트뷰 보임
  • 버튼 3 클릭 → 세 번째 텍스트뷰 보임

덧붙임

  • View.INVISIBLE은 화면에서 안 보이지만 자리를 차지하며, View.GONE은 완전히 사라져 레이아웃에 영향도 준다.
  • 본 코드에서는 INVISIBLE 사용했기 때문에 자리가 유지된다.
  • 버튼과 텍스트뷰 크기 및 배치, 초기 보임 상태는 XML 레이아웃에서 설정된다.

 

테이블레이아웃(TableLayout)은 안드로이드에서 위젯을 표(테이블) 형태로 배치할 때 사용하는 레이아웃이에요. 사용자가 위젯들을 행과 열로 깔끔하게 나누어 관리하고 싶을 때 아주 유용하답니다.


테이블레이아웃의 핵심

  • 행(Row)의 개수: <TableRow> 태그의 개수와 같아요. 각 <TableRow>가 한 행(row)을 의미해요.
  • 열(Column)의 개수: 각 <TableRow> 안에 들어있는 위젯(뷰)의 개수로 결정돼요. 예를 들어 3행 4열 짜리 테이블이라면 각 <TableRow> 안에 4개의 위젯이 들어가 있어야 합니다.
  • 주로 표 형태로 위젯을 구성할 때 쓰여서, 깔끔한 행과 열 구분이 필요할 때 좋죠.

테이블레이아웃 속성

  • layout_column
    특정 위젯을 테이블 내 지정한 열(column)에 배치하라는 의미입니다.
    예를 들어, layout_column="2"는 그 위젯을 2번째 열에 위치시키려는 의도입니다.
  • stretchColumns
    지정한 열의 폭을 늘려서 화면을 꽉 채우도록 하는 속성입니다.
    • 예: stretchColumns="*"
      모든 열의 폭을 고르게 늘려, 화면 가득 테이블을 채울 수 있어요.

그림으로 구성 설명

이미지에서 보이는 것처럼,

  • 3개의 <TableRow>가 있어 행이 3개
  •  <TableRow> 안에 위젯 4개씩 있으니 4열짜리 테이블이 되는 구조
  • 각 행은 <TableRow> 하나가 담당해서 그 안에 여러 위젯들이 들어가요

요약하자면

포인트설명

TableLayout 위젯을 행과 열로 나눈 표 형태 배치에 사용
TableRow 행 하나, 각 행마다 포함된 위젯의 개수로 열 결정
layout_column 위젯을 특정 열에 배치 지정
stretchColumns 열의 폭을 늘려 화면 가득 채우도록 설정 ("*"는 모든 열)

 


레디언트

테이블레이아웃 관련 속성과 예제 XML 코드를 설명해줄게.
주어진 내용에는 테이블레이아웃의 중요한 속성인 layout_span, layout_column, stretchColumns가 등장하고, 이걸 구현한 예제 XML 코드와 화면 배치 이미지도 있어.


1. 속성 설명

  • layout_span
    여러 개의 열(셀)을 합쳐서 한 위젯을 크게 표시할 때 사용해.
    예를 들어, 한 버튼이 2칸 넓이(2열)를 차지하도록 할 수 있어.
  • layout_column
    위젯을 특정 열 위치에 배치하도록 설정하는 속성이야.
    열 번호는 0부터 시작해서 몇 번째 열에 놓을지 정하는 거야.
    예를 들어 layout_column="1"이면 두 번째 열에 위치시킨다는 뜻.
  • stretchColumns
    <TableLayout>에 설정하는 속성으로, 지정한 열들의 폭을 화면에 맞게 늘려주는 역할을 해.
    이 값을 "*"로 주면 모든 열이 균등하게 폭을 늘려서 화면을 꽉 채우게 만들어줘.

2. 예제 XML 코드 설명

xml

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <TableRow>
        <Button android:text="1" />
        <Button android:layout_span="2" android:text="2" />
        <Button android:text="3" />
    </TableRow>

    <TableRow>
        <Button android:layout_column="1" android:text="4" />
        <Button android:text="5" />
        <Button android:text="6" />
    </TableRow>
</TableLayout>
  • 첫 번째 <TableRow>
    • 버튼 "1"은 첫 번째 열(0번 열)
    • 버튼 "2"는 layout_span="2" 속성으로 2열을 합쳐 넓게 차지함 (두 번째와 세 번째 열)
    • 버튼 "3"은 다음 열(실제로 3열이 되지만 span 때문에 위치가 밀릴 수 있음)
  • 두 번째 <TableRow>
    • 버튼 "4"는 layout_column="1"로 두 번째 열에 위치
    • 버튼 "5"는 자동으로 다음 열에 위치 (세 번째 열)
    • 버튼 "6"은 다음 열에 위치 (네 번째 열)

3. 화면 구성

  • 첫 번째 행에는
    1 | 2(2열 합침) | 3
  • 두 번째 행에는
    (빈 공간) | 4 | 5 | 6

이런 식으로 열 병합과 열 위치 지정이 가능해, 보다 자유로운 표 구성이 가능하지~


정리

속성명역할참고
layout_span 열 여러 개를 합쳐 하나의 위젯으로 표시 버튼 넓이 증가
layout_column 위젯을 특정 열에 위치시키기 (0부터 시작) 열 위치 지정
stretchColumns 테이블의 특정 열 폭을 늘려 화면 가득 채움 균등 폭 조정

 

그리드레이아웃(GridLayout)에 대해 설명할게! 테이블레이아웃과 비슷하게 위젯을 표 형태로 배치할 때 쓰는데, 좀 더 직관적이고 유연해서 Android 4.0 (API 14) 이상에서 지원해.


그리드레이아웃(GridLayout)이란?

  • 표 형태로 위젯을 배치하는 레이아웃인데, 테이블레이아웃보다 직관적이라 복잡한 배치에 더 편리해
  • 행(Row)과 열(Column) 기준으로 위치를 지정 가능
  • Android 4.0부터 지원되어 최신 버전에서 안정적으로 사용 가능
  • 특히 동적인 UI나 다양한 크기의 셀 배치에 유리해

그림 설명

  • 행은 layout_row 속성으로 지정하고,
  • 열은 layout_column 속성으로 지정하는 방식을 사용해
  • 그림에서 3행 4열짜리 표에 각 위젯이 배치된 모습 보이지?
  • (0,0)부터 시작해서 좌표로 쉽게 배치 가능하다 보면 돼

비교

특징TableLayoutGridLayout

API 지원 버전 초기부터 지원 Android 4.0 (API 14)부터 지원
배치 방식 <TableRow> 기준 행 단위 행, 열 좌표 직접 지정 가능
유연성 비교적 덜 유연 더 유연하고 직관적
사용 용도 단순 표 형태 배치 복잡한 그리드 레이아웃 디자인에 적합

 

그리드레이아웃(GridLayout) 속성에 대해 정리해볼게!
앞서 그리드레이아웃 개념을 알았으니까, 이번엔 그 안에서 자주 쓰이는 주요 속성들을 중심으로 쉽게 설명할게.


1. GridLayout 자체에 자주 쓰이는 속성

  • rowCount: 그리드의 행(가로 줄) 개수를 지정하는 속성이야.
  • columnCount: 그리드의 열(세로 줄) 개수를 지정하는 속성이야.
  • Orientation: 그리드를 수평 방향(row 위주 배치)으로 할지, 수직 방향(column 위주 배치)으로 할지 정하는 속성이야.
    • 예를 들어 수평 방향이면 한 행씩 먼저 채우고 다음 행으로 넘어가는 식이 돼.

2. GridLayout 안에 포함되는 위젯에서 자주 쓰는 속성

  • layout_row: 해당 위젯이 위치할 ‘행 번호’를 지정해. 행 번호는 0부터 시작!
  • layout_column: 해당 위젯이 위치할 ‘열 번호’를 지정해. 열도 0부터 시작해.
  • layout_rowSpan: 위젯이 차지할 행의 개수를 지정해. 예를 들어 2를 지정하면 2행을 합쳐서 사용한다는 뜻!
  • layout_columnSpan: 위젯이 차지할 열의 개수를 지정하는 것으로, 복수 열을 합쳐서 큰 영역을 만들 때 쓴다.
  • layout_gravity: 위젯이 셀 안에서 어떻게 배치될지 정하는 속성.
    • 예: fill, fill_vertical, fill_horizontal 등으로 셀을 꽉 채우거나, 중앙 정렬, 왼쪽 정렬 등 다양하게 조절 가능해.

요약 표

속성명설명비고

rowCount 그리드 행 개수 지정 GridLayout 자체 속성
columnCount 그리드 열 개수 지정 GridLayout 자체 속성
Orientation 배치 우선 방향 (수평 or 수직) GridLayout 자체 속성
layout_row 위젯이 위치할 행 번호 (0부터 시작) 포함 위젯 속성
layout_column 위젯이 위치할 열 번호 (0부터 시작) 포함 위젯 속성
layout_rowSpan 위젯이 확장할 행 개수 포함 위젯 속성
layout_columnSpan 위젯이 확장할 열 개수 포함 위젯 속성
layout_gravity 위젯의 셀 내 배치 방식 지정 (채우기 등) 포함 위젯 속성, 레이아웃 조절

 

 

프레임레이아웃(FrameLayout)에 대해 설명해줄게!


프레임레이아웃(FrameLayout)이란?

  • 레이아웃 내에 위젯들을 겹쳐서 출력하는 가장 단순한 형태의 레이아웃이야.
  • 화면 왼쪽 상단부터 쌓아 올리듯이 위젯들을 겹쳐서 배치해.
  • 보통 프레임레이아웃 단독으로 쓰기보다는 탭 위젯 같은 다른 UI와 함께 쓸 때 활용도가 높아.

주요 특징

  • 여러 위젯을 겹겹이 쌓아야 할 때 용이해
  • 화면에 겹쳐 보이기 때문에 각 위젯의 위치와 투명도 등을 잘 조절해야 함

프레임레이아웃 속성

속성명설명

foreground 프레임레이아웃의 전경(앞면) 이미지 지정
foregroundGravity 전경 이미지가 화면 내에서 어느 위치에 배치될지 지정

그림 설명

  • 이미지에서 보듯 프레임레이아웃은 여러 위젯이 왼쪽 상단부터 차곡차곡 쌓임.
  • 가장 위에 있는 위젯이 화면에 보이므로, 쌓인 순서에 따라 가려지기도 함.