Giới thiệu
Ví dụ này minh họa cách thay đổi ngôn ngữ ứng dụng (locale) tại runtime khi người dùng chọn từ Spinner.
Các bước thực hiện
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và điền thông tin cần thiết.
Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<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:layout_below="@id/spinner"
android:layout_centerInParent="true"
android:text="@string/thank_you"
android:textSize="24sp" />
</RelativeLayout>
Bước 3: Tạo file strings cho các ngôn ngữ
res/values/strings.xml (Mặc định - Tiếng Anh)
<resources>
<string name="app_name">Language Demo</string>
<string name="thank_you">Thank you</string>
</resources>
res/values-vi/strings.xml (Tiếng Việt)
<resources>
<string name="app_name">Demo Ngôn Ngữ</string>
<string name="thank_you">Cảm ơn bạn</string>
</resources>
res/values-fr/strings.xml (Tiếng Pháp)
<resources>
<string name="app_name">Demo Langue</string>
<string name="thank_you">Je vous remercie</string>
</resources>
res/values-es/strings.xml (Tiếng Tây Ban Nha)
<resources>
<string name="app_name">Demo Idioma</string>
<string name="thank_you">Gracias</string>
</resources>
res/values-hi/strings.xml (Tiếng Hindi)
<resources>
<string name="app_name">भाषा डेमो</string>
<string name="thank_you">धन्यवाद</string>
</resources>
Bước 4: Viết code MainActivity.java
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;
String currentLanguage = "en";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = findViewById(R.id.spinner);
List<String> languages = new ArrayList<>();
languages.add("Chọn ngôn ngữ");
languages.add("English");
languages.add("Tiếng Việt");
languages.add("Français");
languages.add("Español");
languages.add("हिन्दी");
ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_dropdown_item, languages);
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("vi"); break;
case 3: setLocale("fr"); break;
case 4: setLocale("es"); break;
case 5: setLocale("hi"); break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
}
private void setLocale(String localeCode) {
if (!localeCode.equals(currentLanguage)) {
Locale locale = new Locale(localeCode);
Locale.setDefault(locale);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.setLocale(locale); // API 17+
res.updateConfiguration(conf, dm);
currentLanguage = localeCode;
// Restart activity để áp dụng ngôn ngữ mới
Intent refresh = new Intent(this, MainActivity.class);
startActivity(refresh);
finish();
} else {
Toast.makeText(this, "Ngôn ngữ đã được chọn", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
}
Lưu ý quan trọng (Android 7.0+):
- Sử dụng
conf.setLocale(locale)thay vìconf.locale = locale - Cần override
attachBaseContext()trong Application hoặc Activity để persist locale - Xem thêm:
ContextWrappervớiConfigurationWrappercho hỗ trợ tốt hơn
Bước 5: Cấu hình 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>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Chọn ngôn ngữ từ Spinner để xem ứng dụng thay đổi ngôn ngữ ngay lập tức.

