Monday, November 7, 2011

Dấn thân vào con đường mã hóa, bảo mật.

Bắt đầu bằng nguyên lý Kerckhoff:

"Một hệ thống mã hóa phải an toàn ngay cả khi tất cả thông tin về hệ thống đó đều đã được công bố ra ngoài. Bí mật duy nhất của hệ thống là một khóa ngắn."

Mình sẽ tiếp loạt bài này khi học hỏi được cái j mới :)

Tuesday, August 2, 2011

Xăng - nhạc chế của GS Xoay

Am----------------------------------------------Dm
Xăng , sao vừa tăng giá mấy hôm lại tăng
---------------------------------------------Am
Đang thời lạm phát khắp nơi đều căng
------------------------------------------ E
Phen này chết đói dân nhe cả răng
-------------------------------------- Am
Sao lại chơi ác với dân vậy xăng
Xăng bây giờ ta biết kiếm ăn làm sao
Xăng giờ tăng giá mỗi hôm một cao
Bao tiền trong ví mỗi hôm một down
Xăng lại chơi ác với dân vậy sao
----------Dm-------------- E --------------------Am
Giờ xe máy cất trong nhà mình đếch thèm đi
--------------- Dm --------------------------------------E
Đi bằng xe bus chi tiền cũng ít đỡ phải đau đít
------------ Dm ------------ E -------------------- Am
Giờ cưa gái, đến chơi nhà mình cứ tặng xăng
--------------------Dm--------------------------------------- E
Xăng giờ cao giá, lấy lòng ba má không cần hoa lá

(Lặp lại)
Xăng...hay là ta sẽ đi xe đạp chăng
Không chừng cơ bắp mấy hôm lại căng
Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng

Giờ xe máy cất trong nhà đếch thèm đi
Đi bằng xe buýt chi tiền cũng ít đỡ phải đau đít
Giờ cưa gái, đến chơi nhà mình cứ tặng xăng
Xăng giờ cao giá, lấy lòng ba má không cần hoa lá

Xăng...hay là ta sẽ đi xe đạp chăng
Không chừng cơ bắp mấy hôm lại căng
Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng.

Nghe đồn sang tháng giá xăng còn tăng
Nhưng mà tăng nữa cũng mặc mẹ xăng!

Tuesday, July 12, 2011

Cài đặt Cygwin để lập trình C/C++ trên Eclipse

Trước hết bạn cần download Eclipse cho C/C++ về, giải nén ra.
http://www.eclipse.org/downloads/
Tiếp đến bạn tải Cygwin cho window về từ
http://cygwin.com/setup.exe

Bước tiếp theo bạn cài đặt Cygwin, chú ý một số gói quan trọng cần phải cài đặt.
1, binutils
2, gcc
3, gcc-core
4, gcc-g++
5, gcc-mingw-core
6, gcc-mingw-g++
7, make
8, gdb (Nếu bạn muốn hỗ trợ debug trên Eclipse)

Sau khi cài đặt xong, đưa thư mục bin trong thư mục cài đặt Cygwin vào PATH.
Kiểm tra các gói trên đã cài đặt đầy đủ chưa bằng lệnh 'cygcheck -c' trên command.


Bạn hãy mở Eclipse và tạo một project mới với lưu ý lựa chọn toolchain là Cygwin.
Chạy thử nào!!!!

Để cấu hình debug, bạn vào: Windows->Preference->C/C++ -> Debug -> Common Source Lookup
sau đó thêm Path mapping:
\cygdrive\c -> c:\
\cygdrive\d -> d:\

Friday, July 8, 2011

Vết chân tròn trên cát

Vết chân tròn (Dm) vẫn đi về© trên con đường mòn(Am)
cát trắng quê tôi(Am)
Anh thương binh(G) vẫn đến trường làng(Dm) vẫn ôm đàn(Em) dạy các em thơ(Em) bài hát quê hương(Am).

Bài hát(Am) có ngọn núi quê anh(Dm) xa a ... vời (G)
Bài hát(Am) có đồng lúa mênh mang(Dm) câu .. hò(G)
Bài hát© có người lính đã hy sinh(Em) âm thầm(Dm)

Cho hôm nay(F) những gót chân son(G) vui quanh(Em)dấu chân tròn (Am).

Bài hát có trận đấu không quên bên đồi
Bài hát có người lính biên cương thương mẹ
Bài hát có ngọn gió cuốn bay theo dấu chân tròn (Như trên).

Để lại(Em) một bài ca(F)trên cát trắng bao la (Am).

Vết chân tròn(Dm) vẫn in hình (C) trên con đường mòn(Am) cát trắng quê tôi (Am).
Như bài ca(G) anh viết trong thầm lặng (C) trên bờ cát không lời(Dm). Cứ hát mãi trong tôi (Em)
Hát mãi(Dm) trong tôi (C) ôi bài ca cuộc đời (Am)cháy mãi(Em)trong tôi (Am)đốt mãi(Em)trong tôi (Am)

Mắt đen

Sâu trong đáy(Em9) mắt em nói gì(D) đôi mắt huyền(Em)
Không là cao(Em) xa ko thật gần(D) nhưng chứa chan(Em)
(G)_ Khi anh mất lối trên con đường xa(Am)
Trong đôi mắt em ấm lửa soi lối về(Em)
Khi anh vấp ngã(G) mắt em luôn dịu êm(Am)
Rồi đốt cháy lên(B7) cho niềm kiêu hãnh tới(Em)

Muốn được bên(Em) em để đắm chìm(D) trong mắt huyền(Em)
Đến từ đáy(Em) mắt đi cao vời(D) đôi mắt ơi(Em)
(G)_Ngủ vùi khung tranh trắng trơn ngày qua(Am)
Bao nhiêu ước mong(D) sao còn như quá xa(Em)
Màu nào ước muốn(G) màu nào đầy vơi(Am)
Màu nào cháy lên(B7) như lời đôi mắt nói(Em)

(C9)_Mắt đen đôi khi(D) lung linh hạt tinh khôi(Em)
(C9)Mắt đen ơi trái(D) tim anh thuộc về em(Em)
"(G)_Khi anh mất lối trên con đường xa(Am)
Trong đôi mắt em(D) ấm lửa soi lối về(Em)
Khi anh vấp ngã(G) mắt em luôn dịu êm("Am)
Rồi đốt cháy lên(B7) cho niềm kiêu hãnh tới(Em)

(C9)_Mắt đen đôi khi(D) lung linh hạt tinh khôi(Em)
(C9)_Mắt đen ơi trái(D) tim anh thuộc về em(Em)
(C9)_Mắt đen hãy khát(D) khao cháy một lần thôi(Em)
(C9)Mắt đen hỡi(D).... thắp lên ngọn lửa đam mê(Em)

Em)Sâu trong đáy mắt, em nói gì đôi mắt huyền (Em)
Không là cao xa,không thật gần nhưng chứa chan
(G)Khi anh mất lối trên con đường xa (Am)
Trong đôi mắt em (D)ấm lửa soi đường về (Em)
(G)Khi anh vấp ngã,mắt em luôn dịu êm,(Am)
Rồi đốt cháy lên(G) cho niềm kiêu hãnh ...tới. (Em)

Muốn được bên em để đắm chìm trong mắt huyền
Đến từ đáy mắt,đi xa vời đôi mắt ơi
Ngủ vùi khung tranh trắng trơn ngày qua
Bao nhiêu ước mong sao còn như quá xa?
Màu nào ước muốn? Màu nào đầy vơi?
Lời nào cháy lên như lời đôi mắt.... nói!


Ref:
(G)Mắt đen đôi khi (D)lung linh hạt tinh khôi (Em)
(G)Mắt đen ôi trái tim(D) anh thuộc về em (Em)

Ước gì

Em đã sống (G) những đêm trời có (B7) ánh trăng chiếu vàng (Em)
Em đã sống (C ) những đêm ngoài kia (C7) biển ru bờ cát (B7)!

Ước (Em) gì anh ở đây (Bm/D*) giờ này ,

Ước (C ) gì anh cùng em (G) chuyện trò ,

Cùng nhau nghe sóng (C ) xô ghềnh đá ngàn câu hát yên (D) bình .

Em đã biết cô đơn là thế mỗi khi cách xa anh.
Từng đàn chim cuối chân trời biếc tìm nơi bình yên

Ước gì anh ở đây giờ này , ước gì em được nghe giọng cười ,
Và hơi ấm đã bao ngày wa mình luôn sát vai kề !

(C ) Em xa anh đã bao (G/D) ngày rồi nghe như (C9/D**) tháng năm ngừng trôi (D7)
(C ) Đi xa em nhớ anh (G/D) thật nhiều , này người (C9***)
Người yêu em hỡi (D7) !

Uớc (G) gì em đã ko (D) lỡ lời ,
Ước (Em) gì ta đừng có (Bm/D) giận hờn .
Để giờ đây (C ) cô đơn vắng tênh (D7) , đời em đã vắng (G) anh rồi
Ước gì cho thời gian trở lại , ước gì em gặp anh một lần ,
Em sẽ nói (C ) em luôn nhớ anh (D7), và em chỉ có (D#7) anh thôi

Hà nội ngày trở về

Hà Nội ơi (Am) mỗi khi lòng xác xơ (Dm)
Tôi vội vã trở về (G)

Lấy cho mình (Am) dù chỉ là chút bóng đêm (F) trên đường phố quen
Dù chỉ là(Em) 1 chiều hương giăng lối cũ (Am)
Tôi bồi hồi khi chạm bóng cửa Ô (Dm)
Như ngày xưa (G) mỗi lần chạm vai gầy áo mẹ (Am)
Ôi nỗi nhớ (C )muôn đời vẫn thế (Dm)
Như giòng sông Hồng (G )cuộn đỏ mãi trong tôi (Am)
Vội vã trở về(E7) vội vã ra đi (Dm)
Chẳng thể nào qua(G ) hết từng con phố (Am)
Nhưng còn đó © mùa thu,(Em) mùa thu đầy gió ©
Và rêu phong(E7) bên những gốc cây già (Am)
Vội vã trở về (E7) cùng tháng năm xưa (Dm)
Sau những con đường(Em) dầu dãi nắng mưa (Am)
Bên quán ngọ © em buồn (Am) nghe lá trút ©
Chiều mưa sa (Em) giăng kín phố dài (Am)

Hà Nội ơi,(Am) mỗi khi lòng xác xơ(Dm)
Tôi vội vã trở về(G) để nghe tim minh (Em) rưng rưng trong nước hồ thu(Am)

Wednesday, June 8, 2011

Public ứng dụng của bạn lên Android Market.

Bạn đã hoàn thành việc phát triển ứng dụng của bạn sau 1 tuần (có thể ít hơn hoặc nhiều hơn :D) làm việc chăm chỉ và bạn muốn phát hành ý tưởng của bạn cho cả thế giới biết. Bài này tôi sẽ chỉ bạn cách làm điều đó.

Trước hết, bạn phải trả lời một số câu hỏi sau:


1, Bạn đã test kỹ càng ứng dụng của bạn một cách rộng rãi?
Nếu câu trả lời là chưa thì bạn hãy quay trở lại với việc test cho thật kỹ càng, không chỉ trên emulator, bạn cần kiểm tra chúng trong thực tế, trên các thiết bị thật. Nếu có điều kiện, bạn hãy kiểm tra trên các thiết bị khác nhau, của các nhà cung cấp khác nhau, trên các phiên bản OS khác nhau.
Một lỗi nhỏ trong code của bạn có thể làm giảm doanh số bán hàng và danh tiếng của bạn.

2, Ứng dụng của bạn có hiệu năng tốt không?
Hiệu năng là rất quan trọng, đặc biệt nếu ứng dụng của bạn là 1 game. Nếu ứng dụng của bạn không thể đáp ứng trong một trường hợp nào đó, hãy xem lại và tối ưu hóa chúng nếu có thể.

3 Ứng dụng của bạn có tương thích với nhiều phiên bản khác nhau của hệ điều hành?
Hãy nhìn vào biểu đồ bên dưới để có yêu cầu min SDK phù hợp với ứng dụng của bạn.



Tiếp theo chúng ta phải chuẩn bị cho ứng dụng của mình sẵn sàng lên Android Market.


1, Yêu cầu các quyền cần thiết.
Hãy chắc chắn rằng bạn đã yêu cầu các quyền cần thiết trong file cấu hình AndroidManifest.xml. Nếu không ứng dụng của bạn có thể chạy không thật sự suôn sẻ. Ví dụ:




2, Tên và icon của ứng dụng.
Hãy chọn một tên và icon thật đặc biệt cho ứng dụng của bạn, bạn có thể cấu hình nó trong file cấu hình AndroidManifest.xml. Ví dụ:


3, Cấu hình version của ứng dụng.
Hãy cấu hình version ứng dụng của bạn nhằm việc update sau này. Thường nó được cấu hình bằng số nguyên và bắt đầu bằng 1, nhưng bạn có thể tùy biến theo ý bạn có thể là 1.0.0b1 hoặc 2.4.13... Ví dụ:


4, Cấu hình phiên bản hệ điều hành tương thích.
Dựa vào API bạn sử dụng để phát triển ứng dụng, bạn hãy cấu hình phiên bản hệ điều hành tương thích bằng các tham số.
android:minSdkVersion: Phiên bản thấp nhất.
android:targetSdkVersion: Bạn phát triển ứng dụng cho phiên bản này.
android:maxSdkVersion: Phiên bản cao nhất có thể chạy ứng dụng, cái này nên bỏ qua.

5, Xóa bỏ file và log.
Rà soát toàn bộ ứng dụng của bạn, hãy xóa bỏ những file không cần thiết, lời gọi log nhằm debug dữ liệu cá nhân, các file không phải là file resource...

6, Export ứng dụng của bạn với certificate.
Đây là bước quan trọng bới ứng dụng của bạn được đảm bảo ứng dụng của bạn đã được xác thực, vì thế bạn nên tạo một mật khẩu đủ mạnh cho private key của bạn và hãy giữ chúng cẩn thận.
Nếu bạn dùng Eclipse IDE, bạn có thể sử dụng Export Wizard trong eclipse để làm điều này.
a, Bạn chọn File > Export
b, Trong cây thư mục bạn chọn Android -> Export Android Application.
c, Hoàn thành các bước wizard (Bạn có thể xem hình vẽ).





Cách khác bạn có thể sử dụng các tools sau keytool, jarsigner, zipalign...


Bước cuối cùng là đăng ký làm một Market Publisher.

1, Đăng ký
a, Đăng ký dưới một Publisher và cấu hình các thông tin cá nhân của bạn http://market.android.com/publish.
b, Đọc và đồng ý các điều khoản của Android Market http://www.android.com/us/developer-distribution-agreement.html.
c, Trả phí là $25 USD qua Google Checkout.
2, Upload ứng dụng của bạn.
Đăng nhập vào tài khoản publisher của bạn, chọn "Upload an Application" điền các thông tin trên form, nếu ứng dụng của bạn có phí, bạn cần đăng ký Google Checkout Merchant. Cuối cùng chọn "Publish" để đăng ứng dụng của bạn.

OK rồi! cảm giác vui vui khi upload ứng dụng đầu tiên của mình lên android market nào... :D

Saturday, May 28, 2011

Google IO 2011

Rất nhiều kiến thức được trình bày tại google io 2011, các bạn có thể vào đây để xem các video:

http://www.youtube.com/user/GoogleDevelopers

Thursday, May 12, 2011

Bắt đầu tập lại guitar

Hôm nay có một niềm vui nho nhỏ, quyết định tập guitar để sau này dùng. Lâu ngày cầm lại cây đàn đau hết tay nhưng dù sao mình cũng sắp đệm được bài "nhỏ ơi" rồi.

Mình giới thiệu gam bài này mình sưu tầm được:

Lần đầu(Dm) ta gặp nhỏ( C), trong nắng(Am) chiều bay bay(Dm)
Ngập ngừng(Dm) ta hỏi nhỏ( C), nhỏ bảo( C) nhỏ không tên(F)
Ừ thì(Dm) nhỏ không tên( C), bây giờ( C) quen nhé nhỏ(Am), nhỏ ơi(Dm)

(Các đoạn sau thì tương tự.)

Lần này ta gặp nhỏ, trong nắng chiều bay bay
Ngập ngừng ta hỏi nhỏ, nhỏ bảo nhỏ chưa yêu
Ừ thì nhỏ chưa yêu, bây giờ yêu nhé nhỏ, nhỏ ơi

Lần này(Dm), nhỏ quay đi( C), không thèm( C) nhìn ta nữa(Am)
Giọt sầu(Dm) rơi một mình( C), chỉ còn(Dm) ta một mình( C), nhỏ ơi (Dm)

Còn j đâu hỡi người, trong nắng chiều phôi phai
Kỷ niệm ta cùng nhỏ, giờ chỉ là hư vô
Nụ cười là hư vô, xa rồi vẫn nhớ hoài, nhỏ ơi.

Tình cờ ta gặp nhỏ, trong nắng vàng ban mai
thẹn thùng ta hỏi nhỏ, nhỏ bảo khờ ghê đi
Ừ thì khờ ghê đi, thương rồi sao chẳng hiểu, nhỏ ơi!


Like it!

Chỉ dẫn lập trình game 3D trên Android (P6)

Xin lỗi các bạn về sự chậm chễ này, dạo này bận quá nên ko có time để post bài nữa. Nhưng mình sẽ tiếp tục loạt bài viết này khi rảnh.
Bài trước mình đã giới thiệu về Java Native Interface. Nhưng hình như các bạn không thể thực hành được bài này.
Và có những email gửi về cho mình nhờ chỉ dẫn cách chạy JNI như thế nào, các bạn đó chạy ví dụ của google mà không được.
Hôm nay tôi sẽ chỉ các bạn cách chạy native như thế nào.

Như các bạn đã biết lập trình game chúng ta cần tận dụng sức mạnh của phần cứng và Java Native Interface là một cách tuyệt vời để thực hiện nó.
Vậy Java Native Interface làm gì?
Có thể các bạn đã biết thực ra Java Native Interface cho phép chúng ta gọi hàm từ thư viện C/C++ khi đó ta có thể giao tiếp nhiều hơn với phần cứng.
Ok, vậy ta có thể hình dung ta cần j rồi, hiểu về C/C++ (Hiểu sâu nhé :D). Một trình biên dịch trên Window (Những ai dùng Linux thì chuyên gia rồi chắc mình không phải hướng dẫn nữa, và mình cũng khuyên các bạn nên chuyển qua Linux (Ubuntu) mà dùng).
Ở đây mình dùng http://www.cygwin.com/. Bạn phải download Android NDK về nhé http://developer.android.com/sdk/ndk/index.html
Eclipse chắc bạn có rồi :D.

Bắt đầu nhé:
Cài đặt cygwin nhé.
Giải nén Android NDK nhé.
Bây giờ ta sẽ chạy một ví dụ của google viết sẵn để hiểu cách làm việc của nó.
Trong thư mục Android NDK bạn vừa giải nén ra có thư mục sample bạn nhìn thấy một số ví dụ ở đây.
Trên eclipse, bạn tạo một project android mới từ source này, ở đây chúng ta chọn hello-jni nhé.

Giờ chúng ta đã có project trên eclipse rồi.
Trên command của windown (cmd), bạn cd tới thư mục của project trên ...\samples\hello-jni
Chạy command:
 android update project -p . -s

Nhớ rằng trước đó đã path cho android trong thư mục ...android-sdk-windows\tools và ...android-sdk-windows\platform-tools
Và path của ...cygwin\bin nữa nhé.

Giờ chúng ta bắt đầu build native code sử dụng command ndk-build.

Hãy chắc chắn rằng bạn đang ở ...\samples\hello-jni như vậy bạn sẽ không phải gõ đường dẫn này nhiều nữa.
Trên command của window bạn chạy ash (Hãy chắc chắn rằng bạn đã set path cho ...cygwin\bin).
Lúc này bạn đang chạy SHELL trên môi trường GNU/Linux chứ không phải command như ở window nữa.
Chạy command su
Của mình là su tannm
Khi đó bạn sẽ nhìn thấy đường dẫn của bạn giống như:

TanNM@TanNM-PC /cygdrive/e/STUDY/android/android-ndk-r5b/samples/hello-jni

Ngon rồi đấy!
Tiếp theo bạn hãy chạy lệnh:
/cygdrive/e/STUDY/android/android-ndk-r5b/ndk-build

Khi đó output sẽ giống như:
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Compile thumb : hello-jni <= hello-jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so => libs/armeabi/libhello-jni.so

Quay lại eclipse refresh lại project và chạy.

OK chứ?

Friday, March 18, 2011

Câu lệnh xem size và free của table space trong oracle.

select b.tablespace_name, tbs_size SizeMb, a.free_space FreeMb
from  (select tablespace_name, round(sum(bytes)/1024/1024 ,2) as free_space
       from dba_free_space
       group by tablespace_name) a,
      (select tablespace_name, sum(bytes)/1024/1024 as tbs_size
       from dba_data_files
       group by tablespace_name) b
where a.tablespace_name(+)=b.tablespace_name;

Thursday, March 10, 2011

Ra mắt kho game, ứng dụng cho android.

Sau một thời gian phát triển hiện tại mình đã cho ra phiên bản "Release 1.0" kho game và ứng dụng cho android. Hi vọng được sự đón nhận của mọi người.
http://ungdungandroid.net

Tuesday, March 1, 2011

Fix GPS cho Samsung galaxy

Loay hoay mãi mới fix được GPS cho chú Samsung galaxy của mình, thực chất chỉ là thay đổi file cấu hình. Cách làm như sau:

Cấu hình mặc định của Nó ban đầu là:

1, Settings -> Parameter Settings -> Address -> Server Type: UMTS SLP
2, Settings -> Parameter Settings -> Position mode: option2
3, Settings -> Fix Request Settings -> Session Operation: MS-based
4, Settings -> Fix Request Settings -> Server Option: Default
5, gpsOne XTRA -> Xtra Enable: Disable

1, Bấm *#*#1472365#*#*. Đây là mã để vào menu cấu hình GPS. Trong menu đó bạn lần lượt chọn thay đổi một số giá trị bên dưới.
2, Settings -> Parameter Settings -> Address -> Server Type: 1x MPC
3, Settings -> Parameter Settings -> Position mode: option3
4, Settings -> Fix Request Settings -> Session Operation: Standalone
5, Settings -> Fix Request Settings -> Server Option: Local
6, gpsOne XTRA -> Xtra Enable: Enable

Hehehe... Cuối cùng cũng có GPS để sài. :D

Giao diện mới!

http://blog.vn-dev.net đã thay một giao diện mới. Mong được sự đón nhận của mọi người.

Thursday, February 24, 2011

Tạo image header (hay title bằng image) của ứng dụng trên android

Bài trước tôi đã giới thiệu cách control một layout với Image và title. Lần này thêm một bài nữa về layout nhé :D.
Vì vấn đề thương hiệu, các sếp đã bắt Tên của ứng dụng nên để logo của ứng dụng chứ ko chỉ là để chữ không. Mặc định thì nó chỉ hiển thị tên ứng dụng bạn khai báo trong file Manifest. Nhưng bạn hoàn toàn có thể control nó theo ý của mình.

Trước hết tôi design layout main_header cho Title đó như sau.


 

  
 

Ở đây tôi chỉ đưa một image vào đó, nhưng bạn hoàn toàn có thể cho những thứ mà bạn thích vào đây.

Có layout rồi, nhưng làm thế nào để load được nó đây. Bạn để ý thấy trong thẻ Application của file Manifest có thuộc tính sau android:label="@string/app_name":



Cái này chính là cái hiển thị title của ứng dụng.
Ta sẽ ghi đè lên title như sau.
Tạo một style TitleCustomTheme như sau:


 
  
  
 

Và thêm thuộc tính android:theme="@style/TitleCustomTheme" vào trong thẻ application như sau.



Trong class Activity ta load layout đã design như sau:

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.main_header);

Xem thử kết quả nhé. Nhắc bạn luôn nhớ rằng, thương hiệu luôn là vấn đề sống còn của doanh nghiệp :D.

Xem ảnh demo:

Tuesday, February 22, 2011

Xây dựng grid layout cho android với mỗi phần tử bao gồm Icon + title.

Do dạo này bận dự án quá nên chưa viết loạt bài lập trình game 3D tiếp được, loạt bài này tôi sẽ chỉ các bạn một số thủ thuật trong khi tôi làm dự án của mình.
Giới thiệu sơ qua về dự án của tôi, nó được xây dựng cho mảng bán content cho người dùng giống như Sóc Bay hay một số các phần mềm khác.
Hôm nay tôi sẽ chỉ cách cho các bạn thiết kế layout cho màn hình chính của chương trình. Đó là Grid Layout mỗi phần tử bao gồm các Icon + title bên dưới.
Trước hết chúng ta phải xây dựng được layout cho phần tử bên trong, cái này thì đơn giản quá nhỉ, chỉ cần một ImageView và một TextView là được. Nó trông giống như:

 
  
  
  
  
 

Trong main Activity bạn load View như sau
GridView gridview = (GridView) findViewById(R.id.gridview);
 gridview.setAdapter(new ImageAdapter(this, dictionary, dictionary.getChildList().size()));

Trong đó class ImageAdapter load các phần tử ta xây dựng bên trên và xây dựng lớp đó như sau

package vn.vdco.mzone;

import vn.vdco.mzone.util.DictionaryNode;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 
 * @author TanNM
 *
 */
public class ImageAdapter extends BaseAdapter {
 private Context mContext;
 private DictionaryNode dictionary;
 private int sizeArray;
 private Integer[] mThumbIds = null;
 private String[] mTitle = null;

 /**
  * 
  * @param c
  * @param dictionary
  * @param sizeArray
  */
 public ImageAdapter(Context c, DictionaryNode dictionary, int sizeArray) {
  this.mContext = c;
  this.dictionary = dictionary;
  this.sizeArray = sizeArray;
  mTitle = new String[sizeArray];
  mThumbIds = new Integer[sizeArray];
 }

 public int getCount() {
  return mThumbIds.length;
 }

 public Object getItem(int position) {
  return null;
 }

 public long getItemId(int position) {
  return 0;
 }

 /**
  * Load layout for Item with Icon and title
  * @param position
  * @param convertView
  * @param parent
  * @return View
  * @author tannm
  */
 public View getView(int position, View convertView, ViewGroup parent) {
  ImageView iv;
  TextView tv;
  View v;
  init();
  if (convertView == null) {
   LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   v = li.inflate(R.layout.main_icon, null);
   tv = (TextView)v.findViewById(R.id.icon_text);
   tv.setText(mTitle[position]);
   iv = (ImageView)v.findViewById(R.id.icon_image);
   iv.setImageResource(mThumbIds[position]);
  } else {
   v = convertView;
  }

  return v;
 }

 /**
  * Load title and icon in config file to array
  * @author tannm
  */
 private void init()
 {
  if(dictionary != null && dictionary.getChildList() != null && dictionary.getChildList().size() >0)
  {
   for (int i = 0; i < sizeArray; i++) {
    DictionaryNode node = (DictionaryNode)dictionary.getChildList().get(i);
    int resID = this.mContext.getResources().getIdentifier("vn.vdco.mzone:drawable/" + node.getString("$Image$"), null, null);
    mThumbIds[i] = resID;
    mTitle[i] = node.mstrValue;
   }
  }
 }
}

Ở trên tôi có dùng một đối tượng DictionaryNode để lưu trữ cấu hình các image và title cho các phần tử. Bạn có thể xem cách load nó trong phương thức init().
Cấu trúc của nó kiểu như sau:
MainMenu
     NEWS==Đọc báo
          $Image$==n
     FUNNY==Hài hước
          $Image$==hh
....
Khi đó ta sẽ load động các hình ảnh và title từ file cấu hình vào. Chú ý, nếu cái này ko cần thiết bạn nên Fix vì trong điện thoại cần tiết kiệm dung lượng và các sử lý không cần thiết tới mức tối đa do bộ nhớ và CPU nhỏ.

Chúc bạn có một layout tuyệt vời cho ứng dụng của bạn.