android LinearLayout_Intent

LinearLayout

수직, 수평으로 층으로 레이아웃을 하는 방식

android:orientation으로 수직으로 정렬할지 수평으로 정렬할지 결정 추가록 padding에 들어간 dp는 안드로이드 디바이스의 고정값으로 쓰여진다.

  • 예제
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">
    <!--안드로이드는 dp를 사용 (디바이스픽셀)-->
</LinearLayout>

TextView

텍스트를 표시할 수 있게 해준다. 폰트 사이즈, 굵기 등을 설정할 수 있다.

layout_width와 layout_height는 아래 주석과 같이 설정 할 수 있다

글자 크기의 경우 개인마다 시스템에서 폰트의 크기를 조정할 수 있으므로 sp를 사용하여 비율로 조정될 수 있게 설정

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/height"
        android:textColor="@color/custom_black"
        android:textSize="20sp"
        android:textStyle="bold" />
    <!--wrap_content:  컨텐츠의 높이만큼
        match_parent: 부모의 넓이 만큼 (여기서는 기기 꽉 채운다는 의미)
        폰트 sp는 각 폰의 환경설정에 크기에 적용된 비율에 적용된다 (dp는 고정값).
    -->

EditText

텍스트를 입력 할 수 있는 공간을 배치한다. inputType으로 텍스트의 종류를 선택 할 수 있다.

    <EditText
        android:id="@+id/heightEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:inputType="number" />
    <!--텍스트를 추가할 수 있는 영역
        inputType은 클릭시 입력패드의 종류를 선택할 수있게함
    -->

values

레이아웃 xml에 String, color등의 값을 직접 넣어 줄 수 있지만 values에서 설정 후 끌어 쓸 수 있다. (ex : android:text"@string/height")

  1. strings.xml
<resources>
    <string name="app_name">aop-part2-chapter01</string>
    <string name="height">신장</string>
    <string name="weight">체중</string>
    <string name="confirm">확인하기</string>
</resources>

tools

TextView의 값에 kotlin에서 값을 받아 넣어줘야할 경우 초기값을 빈값으로 했을때 레이아웃 잡기 어렵다. 그때 tools 속성을 import하여 사용하면 레이아웃에서는 보이지만, 실제 앱에서는 빈 값으로 나온다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools">

    <TextView
        android:id="@+id/resultTextView"
        tools:text="과체중입니다"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

MainActivity

안드로이드에서 Activity는 한 화면을 의미하며, Main은 첫 화면을 뜻한다. AppCompatActivity()를 상속받아 onCreat()를 통해 화면을 생성한다. setContentView(R.layout.activity_main)은 어떤 레이아웃을 사용할지 설정 해준다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

findViewById()

서로 맵핑을 id를 통해 하며 layout xml에서도 각 태그에게 android:id를 부여하고 findViewById()에서도 인자로 android:id를 넣어주면 값을 가져온다.

activity_main.xml

...
<EditText
    android:id="@+id/heightEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:inputType="number" />

<EditText
    android:id="@+id/weightEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:ems="10"
    android:inputType="number" />

<Button
    android:id="@+id/resultButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="30dp"
    android:text="@string/confirm" />
...

MainActivity.kt

val heightEditText: EditText = findViewById(R.id.heightEditText)
val weightEditText = findViewById<EditText>(R.id.weightEditText)
//버튼 매핑
val resultButton = findViewById<Button>(R.id.resultButton)

setOnClickListener()

버튼 클릭시 실행되는 이벤트 리스너로 람다식으로 로직을 추가하여 버튼 클릭시 작동 되게 한다.

resultButton.setOnClickListener {
    Log.d("MainActivity","ResultButton click")

    //만약 빈값을 그대로 받게되면 아래 toInt() 부분에서 값이 없어서 에러 발생
    if(heightEditText.text.isEmpty() || weightEditText.text.isEmpty()){
        Toast.makeText(this, "빈 값이 있습니다.",Toast.LENGTH_SHORT).show()
        //@setOnClickListener 라벨을 통해 return할 부분 지정
        return@setOnClickListener
    }

    val height: Int = heightEditText.text.toString().toInt()
    val weight: Int = weightEditText.text.toString().toInt()

    Log.d("MainActivity","height : $height , weight : $weight")
}

AndroidManifest.xml

안드로이드에서 activity를 추가하게되면 Manifest.xml에 activity태그를 추가하여 맵핑을 해주어야 한다.

예제로 ResultActivity.kt를 추가하였고 Manifest.xml에도 적용 시켜주었다.

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".ResultActivity"/>

Intent

메시징 객체로 화면간 또는 통신시 값을 전달하는 용도로 사용된다.

인텐트 전송 흐름 image

예제코드

//Intent에 다음 열릴 엑티비티 자바 파일을 담고 startActivity()로 시작을 해준다.
//안드로이드 시스템으로 intent를 넘길때 값을 넘기고
//받는쪽 activity에서 onCreate()할 때 intent에 포함된 값을 받을 수 있다.
val intent = Intent(this, ResultActivity::class.java)
intent.putExtra("height",height)
intent.putExtra("weight",weight)

startActivity(intent)

ResultActivity.kt에서는 아래와 같이 값을 받을 수 있다.

class ResultActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_result)
        val height = intent.getIntExtra("height", 0)
        val weight = intent.getIntExtra("weight", 0)
    }
}

결과

ezgif com-gif-maker