[Android] 나머지 폭 차지하기

UI를 배치할때 나머지 공간을 차지하게 하고 싶은 경우가 있다. 예를들면 아래와 같이..

사진이라는 문자열이 들어간 TextView는 가로폭의 길이가 정해져 있지 않고 나머지 공간을 모두 차지한다. 코드는 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:paddingHorizontal="10dp"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/ivIcon"
        android:src="@drawable/ic_layers_black"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:tint="#444444" />

    <TextView
        android:textSize="@dimen/normal_text_size"
        android:id="@+id/tvCaption"
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="wrap_content" />

    <TextView
        android:textSize="@dimen/small_text_size"
        android:id="@+id/tvDate"
        android:text="2020/12/31 12:13:13"
        android:layout_width="100dp"
        android:textAlignment="center"
        android:layout_height="wrap_content" />

</LinearLayout>

사진에 해당하는 TextView의 layout_weight를 1로 지정하고 있다는게 핵심이다.

[Android] Activity 호출하기

Activity를 호출하는 코드를 정리합니다.

먼저 Activity를 하나 만듭니다. 이 녀석 이름이 DataCollectingListActivity라고 하겠습니다. 이 엑티비트를 호출하는 코드는 다음과 같습니다. 전달해줄 인자는 Intent에 전달해 줍니다.

val intent = Intent(this, DataCollectingListActivity::class.java)
intent.putExtra("featureId", fid);
startActivityForResult(intent, REQUEST_DATA_COLLECTION_LIST)

REQUEST_DATA_COLLECTION_LIST는 엑티비티를 띄우고 닫을때 해당 엑티비를 구분하기 위한 상수값인데요, 아래처럼 선언합니다.

private val REQUEST_DATA_COLLECTION_LIST = 100

다음은 DataCollectingListActivity에서 전달받은 인자를 처리하는 코드입니다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.data_collecting_list_activity)

    val fid = this.intent.getIntExtra("featureId", -1)
    Log.v("DIP2K", "받은 FID: $fid")

    ....
}

엑티비티를 닫는 코드입니다. 닫을때 자신을 호출한 엑티비티에 결과를 전달할 수 있습니다.

val intent = Intent()
intent.putExtra("data", "전달할 데이터")
setResult(RESULT_OK, intent)
finish()

setResult 함수를 통해 대화상자의 개념으로 사용자에게 확인(RESULT_OK)인지, 취소(RESULT_CANCEL)인지에 대한 의사전달이 가능합니다.

띄운 엑티비티가 결과값으로 전달한 내용을 읽는 코드입니다.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (resultCode == RESULT_OK) {
        when (requestCode) {
            REQUEST_DATA_COLLECTION_LIST -> {
                Log.v("DIP2K", data!!.getStringExtra("data")!!)
            }
        }
    }
}