티스토리 뷰

ViewGroup

여러 View들을 포함할 수 있는 컨테이너 클래스, 여러 View를 담아 레이아웃을 구성하는 컨테이너


ViewGroup의 종류

LinearLayout

  • 자식 뷰를 수평(가로) 또는 수직(세로)으로 순차적으로 정렬하는 레이아웃

Spinner

 

  • 사용자가 선택할 수 있는 드롭다운 메뉴를 제공하는 AdapterView 기반의 위젯
  • 단일 선택 항목 리스트를 보여주며, 사용자가 선택한 값 반환

 

ScrollView

 

  • 화면 크기를 초과하는 콘텐츠를 스크롤 가능하게 만드는 레이아웃
  • 기본적으로 자식 뷰는 하나만 포함 가능, 여러 뷰를 배치하려면 레이아웃(예: LinearLayout)으로 감싸야 함
  • 수직 스크롤만 지원하며, 수평 스크롤을 원하면 HorizontalScrollView를 사용해야 함

 

RelativeLayout

 

  • 자식 뷰를 서로 상대적인 위치 또는 부모 컨테이너의 위치를 기준으로 배치하는 레이아웃
  • 뷰 간 관계를 설정할 수 있는 속성 사용:
    • layout_below: 다른 뷰의 아래에 배치
    • layout_toRightOf: 다른 뷰의 오른쪽에 배치
    • layout_alignParentTop: 부모의 상단에 정렬

 

RadioGroup

 

  • RadioButton을 포함하는 그룹으로, 단일 선택 기능 제공
  • 동일 그룹 내에서 하나의 항목만 선택 가능
  • 방향(수평 또는 수직)을 설정할 수 있음

추가적인 ViewGroup 종류

  • ConstraintLayout: 복잡한 UI를 효율적으로 배치할 수 있는 강력한 레이아웃.
  • FrameLayout: 자식 뷰를 겹쳐서 배치할 때 사용.
  • TableLayout: 자식 뷰를 테이블 구조로 배치.
  • GridLayout: 자식 뷰를 그리드 형태로 배치.

Spinner 화면 구성

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:padding="50dp">

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/Widget.AppCompat.Spinner.Underlined"/>

</LinearLayout>

 

 

MainActivity.java

package com.example.test;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String city[] = {"서울", "부산", "울산"};

        Spinner s = findViewById(R.id.spinner);
        ArrayAdapter a = new ArrayAdapter(this, android.R.layout.simple_spinner_item, city);
        s.setAdapter(a);
    }
}

출력 화면


Spinner 토스트 메시지 출력

MainActivity.java

  • OnItemSelectedListener: 사용자가 항목을 선택하거나 변경했을 때 호출, 기존에 선택된 항목이 다시 클릭되어도 호출되지 않을 수 있음
package com.example.test;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String city[] = {"서울", "부산", "울산"};

        Spinner s = findViewById(R.id.spinner);
        ArrayAdapter a = new ArrayAdapter(this, android.R.layout.simple_spinner_item, city);
        s.setAdapter(a);

        s.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(MainActivity.this, city[i], Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            	// 선택된 항목이 없을 때 처리 (필요 시 구현)
            }
        });
    }
}
출력 화면

ScrollView

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="40dp"
            android:text="신청서 작성"
            android:textSize="20sp" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:hint="이름" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:hint="국적" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:hint="거주지(도시명 등)" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:hint="상세주소" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:hint="전자메일주소" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:hint="연락처" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:hint="비상 연락처 (선택)" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="제출" />
    </LinearLayout>
</ScrollView>

 

MainActivity.java

package com.example.test;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

스크롤 기능: 마우스로 드래그 시 스크롤 가능


ScrollView (no XML)

MainActivity.java

package com.example.test;

import android.os.Bundle;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ScrollView s = new ScrollView(this);
        s.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

        LinearLayout ll = new LinearLayout(this);
        ll.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        ll.setGravity(Gravity.CENTER_HORIZONTAL);
        ll.setOrientation(LinearLayout.VERTICAL);
        TextView tv=new TextView(this);
        tv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        int px=dp2px(40);
        tv.setPadding(px,px,px,px);
        tv.setTextSize(20);
        tv.setText("신청서 작성");
        ll.addView(tv);
        String v[]={"이름", "국적", "거주지(도시명 등)", "상세주소", "전자메일주소", "연락처", "비상연락처 (선택)"};
        px=dp2px(20);

        for (int i = 0; i < 7; i++) {
            EditText edittext = new EditText(this);
            LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            lp.setMargins(px, px, px, px);
            edittext.setLayoutParams(lp);
            edittext.setHint(v[i]);
            ll.addView(edittext);
        }

        Button button=new Button(this);
        button.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        button.setText("제출");
        ll.addView(button);

        s.addView(ll);
        setContentView(s);
    }
    private int dp2px(int dp) { return (int)(dp*getResources().getDisplayMetrics().density+0.5); }
}

출력 화면

공지사항
링크