이 튜토리얼에서는 사용자가 언어를 선택했을 때 안드로이드 앱의 언어를 즉시 변경하는 방법을 단계별로 살펴봅니다. 스피너(Spinner) 위젯으로 언어 목록을 구성하고, 선택된 언어에 맞게 로케일(Locale)을 설정한 뒤 액티비티를 새로 불러오는 방식으로 구현합니다.
1단계 — 새 프로젝트 생성
Android Studio에서 File → New Project를 선택하고, 프로젝트 생성에 필요한 정보를 모두 입력하여 새 프로젝트를 만듭니다.
2단계 — 메인 레이아웃 작성 (res/layout/activity_main.xml)
화면 중앙에는 언어를 고르는 스피너를, 그 아래에는 선택한 언어로 표시되는 인사말을 보여줄 TextView를 배치합니다.
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:id="@+id/rl" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" tools:context=".MainActivity"> <Spinner android:id="@+id/spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> <TextView android:id="@+id/string" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/thank_you" android:textSize="24sp" android:layout_centerInParent="true" android:layout_below="@id/spinner"/> </RelativeLayout>
3단계 — 메인 액티비티 구현 (src/MainActivity.java)
스피너에서 항목을 선택하면 onItemSelected() 콜백이 호출되고, 선택된 위치 값에 따라 setLocale() 메서드가 해당 언어 코드("en", "es", "fr", "hi")를 적용합니다. 이미 선택된 언어와 동일하다면 토스트 메시지로 알려주고, 다른 언어라면 설정을 갱신한 후 현재 언어 값을 Intent에 담아 MainActivity를 다시 시작함으로써 UI 전체를 새로고침합니다.
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
Spinner spinner;
Locale locale;
String currentLanguage = "en", currentLang;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
currentLanguage = getIntent().getStringExtra(currentLang);
spinner = findViewById(R.id.spinner);
List<String> list = new ArrayList<>();
list.add("Select Language");
list.add("English");
list.add("Español");
list.add("Français");
list.add("Hindi");
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.support_simple_spinner_dropdown_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
break;
case 1:
setLocale("en");
break;
case 2:
setLocale("es");
break;
case 3:
setLocale("fr");
break;
case 4:
setLocale("hi");
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void setLocale(String localeName) {
if (!localeName.equals(currentLanguage)) {
locale = new Locale(localeName);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = locale;
res.updateConfiguration(conf, dm);
Intent refresh = new Intent(this,
MainActivity.class);
refresh.putExtra(currentLang, localeName);
startActivity(refresh);
} else {
Toast.makeText(MainActivity.this, "Language
already selected!", Toast.LENGTH_SHORT).show();
}
}
public void onBackPressed() {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
System.exit(0);
}
}4단계 — 다국어 strings.xml 리소스 추가
기본 strings.xml 외에 스페인어(values-es), 프랑스어(values-fr), 힌디어(values-hi) 리소스 폴더를 각각 만들고, 언어별 문자열을 정의합니다. 시스템은 앱의 로케일에 따라 알맞은 strings.xml 파일을 자동으로 찾아 적용합니다.
values-hi/strings.xml
<resources> <string name="app_name">Sample</string> <string name="thank_you">धन्यवाद</string> </resources>
values-fr/strings.xml
<resources> <string name="app_name">Sample</string> <string name="thank_you">Je vous remercie</string> </resources>
values-es/strings.xml
<resources> <string name="app_name">Sample</string> <string name="thank_you">Gracias</string> </resources>
strings.xml (기본값)
<resources> <string name="app_name">Sample</string> <string name="thank_you">Thank you</string> </resources>
5단계 — 매니페스트 설정 (AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
앱 실행 및 결과 확인
실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 옵션 목록에서 본인의 모바일 기기를 선택하세요. 그러면 기기에 아래와 같은 기본 화면이 표시됩니다.


스피너에서 언어를 바꿀 때마다 "Thank you" 문구가 Gracias(스페인어), Je vous remercie(프랑스어), धन्यवाद(힌디어) 등으로 즉시 변경되는 것을 확인할 수 있습니다.
참고: 더 현대적인 방식 (AndroidX)
위 예제에서 사용한 Resources.updateConfiguration() 방식은 API 24(누가)부터 deprecated되었으므로, AndroidX AppCompat 1.6.0 이상을 사용하는 프로젝트라면 AppCompatDelegate.setApplicationLocales()를 활용하는 것이 좋습니다. 이 방식은 액티비티를 수동으로 재시작하지 않아도 언어가 적용되며, Android 13 이상에서 제공하는 시스템의 앱별 언어 설정과도 자동으로 연동됩니다.