2023.12.28(목) TIL

quinones·2023년 12월 28일

다국어 지원

Android Studio는 다국어지원이 가능하다. 그러기 위해서는 xml에서 android:text="안녕" 이런식으로 string값을 저장하면 안되고, res/values/strings.xml파일 안에서 값들을 저장해줘야한다.

<resources>
    <string name="app_name">SpartaMarket</string>
    <string name="main_mypage">mypage</string>
</resources>

이런식으로 값을 저장할 수 있고, xml에서 사용하는 방법은 android:text="@string/main_mypage" 이런식으로 파일에서 설정해둔 name이름을 사용하면 가능하다.

그후

여기부분을 클릭해주면

이렇게 나온다. Default Value는 현재 값이고, 여기서 현재 우리가 사용하고있는 언어인 한국어를 찾아서 가져온다.

이렇게 Default Value옆에 Korean이라고 새로운 칸이 만들어 진다. Default Value에 있던 "안녕"을 Korean에 옮겨주고, 안녕의 영어인 Hello를 Default Value에 써준다.

이렇게 하면 끝난다. 휴대폰에서 언어설정이 한국어로 설정되어있다면 "안녕", 영어로 설정되어있다면 Hello가 나오게 될 것이다.

화면 가로모드

사용자가 휴대폰을 가로로 돌렸을때, 앱은 내가 구성했던 화면비율과 달라지기때문에 ui가 잘 보이지 않는다. 개발자는 이런 상황에 대비해야한다. res파일 안에 layout-land 리소스 파일을 추가로 만들어준다. 그후 내가 activity_main.xml파일에 대해서 가로모드를 만들어주고싶다면 해당 파일을 그대로 복사해서 가져온다.

나는 저 파일들중에 main과 detail.xml파일에 대한 가로모드를 만들어준 것이다.
이렇게 한 후에, 복사한 파일을 내가 원하는 ui로 꾸며준다면 가로모드로 지원이 가능하다.

중복 scrollView

화면 가로지원을 하다보니 문제가 생겼다. 기존에 있던 main.xml파일 안에 이미 scrollView가 존재하는데, 가로모드에서 화면이 짧으니 모든 파일을들 scrollView해서 같은 ui를 스크롤해서 볼 수 있도록 만들었다. 하지만 scrollView가 중복된다면 부모 scrollView만 사용이 가능하다. 이때 사용할수 있는 방법이다.

  1. 부모 scrollView를 androidx.core.widget.NestedScrollView로 바꿔준다.
<androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

이런식으로 이름만 바꿔주면된다.

  1. 자식 스크롤뷰(안에있는 스크롤뷰)안에 android:nestedScrollingEnabled="true" 값을 넣어준다.

이렇게 두 단계를 수행하면 스크롤 하다가 안에있는 또다른 스크롤뷰를 만났을때, 해당 스크롤로 전환되고, 해당 스크롤이 모두 내려가면 다시 부모 스크롤로 이동이 가능하다.

scrollView에 값 동적으로 넣어주기

xml상에서 데이터를 넣어주지 말고, 상황에 따라서 원하는 값을 넣기 위해서 코드를 바꿔줬다.

private lateinit var scrollView: ScrollView
private lateinit var productListInnerLayout: LinearLayout


scrollView = findViewById(R.id.scrollView)
productListInnerLayout = findViewById(R.id.productListInnerLayout)

updateProductScrollView(selectedCategory)

먼저 스크롤뷰와 그안을 감싸고있는 리니어 레이아웃을 초기화시켜준다.
그후 updateProductScrollView함수를 선택된 카테고리에 맞게 가져와준다.

이미지와 해당 이미지에 대한 이름을 같이 합쳐서 스크롤뷰에 올리기 위해서 형식을 정해줬는데, product_item.xml파일을따로 만들어서 형식을 정해줬다.

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

    <ImageView
        android:padding="20dp"
        android:id="@+id/productImageView"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:src="@drawable/ic_launcher_foreground"
        android:scaleType="centerCrop"/>

    <TextView
        android:layout_gravity="center"
        android:id="@+id/productNameTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginStart="16dp"
        android:text="Product Name"
        android:textSize="18sp"/>
</LinearLayout>

리니어 레이아웃을 horizontal로 선언해주고, 이미지뷰와 텍스트뷰를 넣어서 정해주었다. 여기서 선언한 위젯들의 아이디는 위에 함수에서 초기화 시켜주고, 해당 이미지에 내가 따로 만들어둔 상품들의 데이터베이스가 저장되어있는 객체에서 가져와서 띄워주었다.

fun getProductList(category: String):List<Product>{
    return when(category){
        "mac" -> Product.productMacList
        "window" -> Product.productWindowList
        else -> emptyList()
    }
}

Product의 getProductList함수는 이렇게 만들어줬다.

이렇게 카테고리가 선택됨에 따라 저장해둔 리스트중 원하는 값을 가져와서 화면에 띄워주고, 다른 카테고리가 선택되면 실시간으로 스크롤뷰를 업데이트 시켜주었다.

profile
이우진

0개의 댓글