17/07/2011

Sử dụng ngôn ngữ trong ứng dụng Android không phụ thuộc vào locale của thiết bị

Các bạn chắc ai cũng biết Android support multi-language dựa vào cơ chế alternative resource và locale của device. Điều đó có nghĩa là ngoài thư mục res/values bạn cần chuẩn bị các thư mục res/values-[mã ngôn ngữ] hay res/values-[language code]-r[mã vùng] ( nếu như ngôn ngữ có nhiều vùng, nhiều quốc gia sử dụng) khi bạn muốn ứng dụng của bạn hỗ trợ một ngôn ngữ nào đó. Ngoài ra để ứng dụng bạn chuyển sang ngôn ngữ này thì bạn cần cấu hình cho thiết bị sử dụng locale tương ứng với ngôn ngữ.
Tuy nhiên có một tình huống đặt ra như sau: Bạn dùng máy với locale Tiếng Anh nhưng bạn lại muốn ứng dụng của bạn hiển thị Tiếng Việt. Hay ứng dụng của bạn có nơi hiển thị danh sách ngôn ngữ, người dùng chọn ngôn ngữ nào thì ứng dụng bạn hiển thị ngôn ngữ đó. Bài toán này được giải quyết như sau:

String languageToLoad  = "vi";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, null);
Trong tập tin AndroidManifest.xml:
<activity
  android:label="@string/app_name"
  android:name=".Dex"
  android:configChanges="locale">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"
/>   
Sau đó để không phải restart lại ứng dụng chúng ta sử dụng câu lệnh sau:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
Tham khảo:
  1. Force Locale on Android
  2. Selecting language from within the app rather than by locale of the system settings

11/04/2011

QML Internationalization

  • Bước 1: Sử dụng một trong các hàm sau để đánh dấu các chuỗi cần biên dịch: qsTr(), qsTranslate(), QT_TR_NOOP() và QT_TRANSLATE_NOOP(). Ví dụ: Text {text:qsTr("Monday")}
  • Bước 2: Sử dụng lupdate để tạo translation source file:
    ví dụ:
    lupdate vidu.qml -ts vidu.ts
    Chúng ta dùng Linguist mở vidu.ts, dịch rồi release thu được tập tin vidu.qm
  • Bước 3: Thực thi qmlviewer với tuỳ chọn translatation:
    qmlviewer -translation vidu.qm vidu.qml

02/04/2011

Trạng thái mạng và android.net.conn.CONNECTIVITY_CHANGE

Đối với một số người mới lập trình hệ thống trên Android sẽ lúng túng khi sử dụng android.net.ConnectivityManager để quản lý trạng thái mạng (kết nối, đứt kết nối ...). Sau đây là một ví dụ đơn giản để giải quyết vấn đề này:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class NetworkStateReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(android.net.conn.CONNECTIVITY_CHANGE)) {
//Làm việc gì đó
}
}
}
Trong manifest file:
<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  </intent-filter>
</receiver>   

Canterbury đặt dấu chấm hết cho Debian, Gentoo, Grml, OpenSUSE và Arch Linux

Dự án Canterbury sẽ cho ra đời Canterbury Linux. Đây có thể ví như sự kiện nhà Tần thống nhất Trung Hoa vậy vì Canterbury là sự hợp nhất của Debian, Gentoo,Grml, OpenSUSE và Arch Linux.
 Thông tin chính thức đã có trên trang chính của các distro trên:
  • http://www.debian.org/News/2011/20110401
  • http://www.gentoo.org/news/20110401-canterbury.xml 
  • http://blog.grml.org/archives/352-The-Canterbury-Project.html 
  • http://news.opensuse.org/2011/04/01/the-canterbury-distribution/ 
  • http://www.archlinux.org/news/the-canterbury-project/ 
Do đó tất cả những thần dân của Debian, Gentoo, Grml, OpenSUSE hay Arch bây giờ có thể hợp nhất dưới mái nhà chung Centerbury rồi.
Sự hợp nhất này đem lại cái lợi lớn là làm đơn giản hoá cho các nhà phát triển ứng dụng tuy nhiên lại làm mất đi sự phong phú, đa dạng trong cộng đồng chim cánh cụt.

24/03/2011

Alert Dialog trong Android

Trong lập trình phát triển ứng dụng Android để giao tiếp với người dùng có hai cách:
  1. Sử dụng một màn hình (Activity)
  2. Sử dụng hộp thoại (Dialog)
Tuỳ tình huống cụ thể chúng ta chọn giải pháp phù hợp.
Việc sử dụng một Dialog thông minh đôi khi cho chúng ta một giải pháp tuyệt vời.
Để hiển thị Dialog trong Android chúng ta thường sử dụng AlertDialog.
Sau đây là đoạn mã sử dụng AlertDialog tôi thường sử dụng:
AlertDialog.Builder mAltBld = new AlertDialog.Builder(this);
mAltBld.setMessage("")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface aDialog, int aID){
//Thực hiện điều gì đó khi người dùng bấm nút Yes.
}
})
.setNegativeButton("No",new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface aDialog, int aID){
//Thực hiện điều gì đó khi người dùng bấm nút No.
aDialog.cancel();
}

});
AlertDialog mAlert = mAltBld.create();
//Tiêu đề cho AlertDialog
mAlert.setTitle("Tiêu đề");
//Biểu tượng cho AlertDialog
mAlert.setIcon(R.drawable.icon);
mAlert.show();

03/03/2011

Lấy tên phương thưc hiện tại

Trong lập trình Java. Dôi khi bạn muốn lấy tên phương thức hiện tại ví dụ để xuất thông tin phục vụ cho gỡ rối chẳng hạn. Sau đây là kinh nghiệm của cá nhân mình:
Đối với Java 4:
new Exception().getStackTrace()[0].getMethodName();
Đối với Java 5:
Thread.currentThread().getStackTrace()[1].getMethodName();