Wednesday, July 17, 2013

Hiệu ứng động cho android (animation)

Mình đã làm xong đồ án và có thời gian làm tiếp cho phần mềm RC4W (link ở trên). Mấy ngày qua làm và thấy rằng hiệu ứng động (animation) cho android khá là dễ làm, bắt mắt và làm cho phần mềm sinh động hơn. Cũng lạ là ít thấy người ta chia sẻ về cái này.

Chi tiết hơn về cái này có thể xem ở: http://developer.android.com/guide/topics/graphics/view-animation.html

Thật ra mình mới tìm hiểu về View Animation nghĩa là hiệu ứng động chỉ dành cho View. Nhưng với người mới bắt đầu (như mình) thì thế là đủ để nghịch. Ở đây tiếc là không có file video hay gif nào minh họa hiệu ứng.

Để làm Animation cho View, rất đơn giản là tạo ra một file xml ở trong thư mục anim có dạng:

 
        

Đoạn trên là hiệu ứng fade-in, tức là View sẽ hiện ra dần dần (alpha tăng dần, transparent giảm dần).
Ở đây mình không nói chi tiết về cú pháp file này vì ở dưới sẽ có link đến một chỗ có thể download vài animation đơn giản để sử dụng luôn (và để từ đó mà học, bắt chước theo). Còn cụ thể về cú pháp file xml cho animation này thế nào thì bạn tham khảo ở link http://developer.android.com/guide/topics/resources/animation-resource.html

Và để dùng trong chương trình android chỉ cần thế này:
Animation anim = AnimationUtils.loadAnimation(getBaseContext(),R.anim.fadein);
someview.startAnimation(anim);
someview.setVisibility(View.VISIBLE);
Ở đây giả định rằng someview trước đây ẩn, giờ hiện ra. Nếu ngược lại làm nó biến mất thì dùng fade-out.
Ở đây Animation được tạo bằng cách load ra từ xml (R.anim.fadein; có file fadein.xml trong thư mục anim) bằng AnimationUtils.loadAnimation. Có thể tạo animation bằng cách dùng mã lệnh java nhưng mình không nói ở đây vì mình thấy dùng xml dễ dàng hơn nhiều.
Tiếp theo someview (là View) sẽ startAnimation với animation đã được load ở trên.
Tiếp theo nữa là hiện nó ra. Nếu không cho nó hiện ra thì animation kết thúc nó lại biến mất.

Tóm lại:
+ Nếu có thể, nên dùng animation để chương trình thêm sinh động, vì công sức để làm là không nhiều
+ Bạn có thể dùng file xml animation sẵn có, copy vào thư mục anim, và viết 3 dòng code, thế là đã có một hiệu ứng vào ra thú vị.
+ Có một trang có vài animation xml mà bạn có thể tải về dùng ngay: http://www.mokasocial.com/2011/07/7-simple-useful-android-xml-animations/



Friday, June 14, 2013

Làm thế nào để Root Bluestacks

Với những ai không biết thì Bluestacks là một phần mềm mô phỏng hệ điều hành android, chạy trên windows. Bạn có thể dùng Bluestacks để thử nghiệm chương trình android của mình thay vì dùng chương trình mô phỏng mặc định của google. Phải nói là tốc độ của Bluestacks nhanh hơn chương trình mô phỏng của google rất rất nhiều. Bạn có thể chơi game 3D trên đó được!

Root Bluestacks (với ai không biết root là gì, thì tìm google: android root) có 2 cách thực hiện: rất phức tạp và đơn giản. Mình đọc cách rất phức tạp kia và thấy quá váng đầu nên không đọc nữa, nếu thích thì bạn tìm hiểu ở xda-developers.

Cách đơn giản là như sau:

  1. Cài BlueStacks
  2. Tắt nó đi (dùng TaskManager tắt cho triệt để)
  3. Tải bản đã root người ta làm sẵn cho version 0.7.12.896 
  4. Giải nén file tải về (bằng 7-zip)
  5. Copy phần giải nén vào: C:\ProgramData\BlueStacks\
  6. Chạy Bluestacks
Cách này đơn giản nhưng bị hạn chế bởi phiên bản root sẵn, và thật ra thì cũng không dễ tìm kiếm. 


Tuesday, May 28, 2013

FragmentPagerAdapter và lỗi NullPointerException khi xoay màn hình

Hôm qua phát hiện ở phần mềm RC4W client của mình bị lỗi kì lạ: khi người sử dụng xoay màn hình, chương trình bị force close.

Nguyên nhân sau khi tìm hiểu thì do hàm getActivity dùng cho Fragment trả về giá trị null sau khi người sử dụng xoay màn hình, điều này phát sinh NullPointerException. Tìm hiểu rất nhiều nơi thì tìm được một câu trả lời hợp lý ở đây: http://stackoverflow.com/questions/11631408/android-fragment-getactivity-sometime-returns-null

Nguyên nhân lỗi

Ngắn gọn: mình đã làm "không theo sách".

Dài dòng hơn:
1) Lỗi thứ nhất: tạo fragment mới mỗi lần onCreate() được gọi.
myfragment = new MyFragment();

Lệnh này gọi trong mỗi lần onCreate() của Activity. Theo hướng dẫn (không biết nguồn chính thống ở đâu, nhưng có 1 ở  nguồn không chính thống ở đây ), KHÔNG nên tạo fragment mới mỗi lần onCreate() của Activity. Theo đó, người ta hướng dẫn là dùng kiểu như sau:
    CustomFragment fragment;
    if (savedInstanceState != null) {
        fragment = (CustomFragment) getSupportFragmentManager().findFragmentByTag("customtag");
    } else {
        fragment = new CustomFragment();
        getSupportFragmentManager().beginTransaction().add(R.id.container, fragment, "customtag").commit();
    }

Tức là mỗi lần onCreate() được gọi, kiểm tra xem fragment có đã được tạo ra và đang được FragmentManager quản lý hay không. Nếu có thì lấy ra (bằng tag), không thì tạo mới. Tag này là String do mình tùy chọn.

2) Nhưng vẫn chưa hiểu tạo sao fragment mới tạo ra mỗi lần onCreate() lại làm cho getActivity() của nó trả về null.
Nguyên nhân nằm ở FragmentPagerAdapter. FragmentPagerAdapter có cơ chế tự gán tag, từ tìm lại fragment đã tạo. Nhờ đó mình không phải quan tâm đến đoạn mã kiểm tra tag và gán tag như ở mục trên nữa. Xem mã nguồn của FragmentPagerAdapter để biết thêm chi tiết. Khi mình tạo mới một fragment khi onCreate(), FragmentPagerAdapter này nó lại không quan tâm, nó tìm xem fragment cũ có không, và nhiều khi nó còn tồn tại (do FragmentManager quản lý), thế là nó lấy fragment cũ ra sử dụng, fragment mới bị bỏ qua và không được gắn với Activity nào. Kết quả là hàm gọi getActivity() thực hiện với Fragment mới trả về null.
Nguyên nhân nữa nằm ở việc mình truy cập tới fragment thông qua tên biến fragment này. Tức là lúc nào cũng là Fragment mới.

Tóm lại, để có lỗi này cần làm những việc sau:
Khi coding:
+ Sử dụng Fragment, FragmentPagerAdapter
+ onCreate(): tạo new Fragment (có thể là CustomFragment của bạn)
+ trong mã lệnh của class CustomFragment có gọi getActivity()
+ truy cập đến 1 biến CustomFragment trực tiếp

Khi sử dụng:
+ Activity mở ra -> onCreate() -> new Fragment (1)
+ Khi cần hiển thị Fragment, FragmentPagerAdapter tìm xem có fragment này trong FragmentManager không. Nếu có thì lấy ra dùng luôn, nếu không sẽ gọi hàm getItem() và sẽ add fragment này vào FragmentManager với Tag nó tự tạo ra. Sau đó Attach fragment này vào Activity.
+ Xoay màn hình -> recreate lại Activity -> gọi onCreate() -> new fragment (2).
+ Khi cần hiển thị Fragment, FragmentPagerAdapter sẽ làm như trên và tìm lấy ra được fragment (1) và hiển thị bình thường
+ Ở đâu đó bạn truy cập vào fragment(2) một cách trực tiếp, trong đó lại gọi getActivity. ---> NullPointerException. Vì fragment(2) không được FragmentPagerAdapter sử dụng và attach cho Activity nào cả.

Cách khắc phục lỗi này: 

Lỗi này mình khắc phục bằng cách là mỗi lần onCreate(), không gọi tạo new fragment mới ngay mà kiểm tra findFragmentByTag trong FragmentManager trước. Đầu vào Tag được tạo từ hàm makeFragmentName() ở trong  mã nguồn của FragmentPagerAdapter

Dù cách này dùng được nhưng cho thấy một lỗi rất quái đản và sự thiếu logic trong SDK của android. Trước giờ mình đều nghĩ là ở onCreate() thì phải create (new) chứ sao lại phải tìm lại xem có fragment đã tạo trước rồi hay không. Hay mình đã sai từ đầu? Tất cả widget khi recreate đều có thể sử dụng lại, không cần tạo mới? Sẽ tìm hiểu thêm về vấn đề này.



Thursday, May 16, 2013

Android Studio mới 15/05/2013

Hôm nay 15/5/2013, Google đã ra mắt bộ IDE lập trình cho android: android studio. Android studio được phát triển dựa trên Intellij IDEA Communitity Edition.

Mình đã chuyển sang Intellij IDEA từ eclipse khi phát triển chương trình RC4W. Mình từng nói một số cái hay của IDE này trong một bài viết kêu gào về cái khó trong lập trình android. Trong bài đó nói rằng công cụ mặt định mà google giới thiệu trên trang developer android của mình là eclipse. Việc sử dụng eclipse cồng kềnh, nặng nề, lắm lỗi cho những người mới lập trình android là đúng là như đi vào bụi rậm. Giờ đây Google ra Android Studio dựa trên Intellij IDEA thật sự quá tốt.

Mình đã tải về dùng thử, cảm nhận ban đầu là tốt, nói chung là giống với Intellij IDEA. Google có bổ sung thêm một số thứ linh tinh khác nữa nhưng chưa thử.

Với người dùng Windows, có lẽ nên đặt biến môi trường (Enviroment variables) trước khi chạy: JDK_HOME = <đường dẫn đến JDK> (ví dụ: c:\Program Files\Java\jdk1.7.0_2)

+1 cho công cụ lập trình tốt.

Sunday, May 12, 2013

Debug phần mềm android sử dụng Bluestacks

Nếu như bạn chưa biết thì bluestacks là phần mềm giả lập android chạy trên Windows và Mac OS. Nó giả lập rất tốt! Cảm giác là phải chạy nhanh gấp 10 lần giả lập mặc định của Google. Cài đặt rất đơn giản, chỉ cần tải file cài đặt ở trang chủ www.bluestacks.com và cài đặt.

Sau khi cài đặt xong bluestacks và chạy chương trình, bạn có thể debug chương trình android của mình ngay lập tức vì bluestack hiện lên trong danh sách thiết bị:

Bạn có thể xem logcat đầy đủ:


Và đây là màn hình giả lập của bluestacks: Đây là phần mềm Remote controller for walaoke của mình giả lập trên bluestacks.

Khi bạn cài đặt bluestacks, có thể bạn sẽ thắc mắc là kích thước màn hình nó không như hình ảnh ở trên. Bởi vì mình dùng một phần mềm tweak kích thước màn hình để thay đổi kích thước cho nó giống như ở trên điện thoại (màn hình dọc). Bạn hoàn toàn có thể thay đổi để thử các loại kích thước màn hình khác nhau để kiểm tra khả năng tương thích của phần mềm của bạn.

Quảng cáo: nếu bạn thích hát karaoke, mời bạn dùng thử Walaoke để biến máy tính của bạn thành đầu karaoke cùng với phần mềm điều khiển từ xa mình mới viết để chọn bài trực quan thuận tiện. (http://rc4w.blogspot.com - địa chỉ blog hướng dẫn; nên xem hướng dẫn cách cài đặt cả server nữa vì trên android chỉ là client)

Saturday, May 11, 2013

Cài android ra bộ nhớ ngoài cho điện thoại mất bộ nhớ trong

Đây là vấn đề không liên quan đến lập trình android, mà nó liên quan đến sửa điện thoại. Tuy nhiên mình vừa mắc phải sự cố này: con Samsung captivate (I897) đột nhiên chết bộ nhớ trong, bootloop, không thể khởi động lên được. Mình mò mẫm các nơi tìm cách xử lý và tìm được ở xdadeveloper (cái này dùng cho galaxy tab, nhưng cũng tương tự) hay ở youtube (dùng cho I9000M, nhưng cũng tương tự)

CẢNH BÁO: ai có đọc bài này mà cố làm theo thì tự chịu trách nhiệm về hành động của mình! Bạn cần hiểu mình đang làm gì, đọc đi đọc lại cách làm nhiều lần trước khi tiến hành.

Hiện tượng:
+ Bootloop
+ Vào recovery thấy báo lỗi /dev/block/mmcblk0p1
+ Cố gắng format mọi thứ liên quan đến bộ nhớ trong (data, datadata) đều vô dụng

Cách xử lý (ngắn gọn): cài OS ra bộ nhớ ngoài

Cách xử lý (đầy đủ)

Chuẩn bị:
+ Thẻ nhớ càng to càng nhanh càng tốt: như mình 16GB class 10.

+ Phần mềm minitool partition dùng để phân vùng cho thẻ nhớ cho giống với bộ nhớ trong được phân vùng khi xuất xưởng
+ ROM và công cụ để flash ROM (samsung là odin; hãng khác thì không rõ)
+ Công cụ để root và adb.

Tiến hành:

+ Bước 1: dùng minitool partition tạo phân vùng cho thẻ nhớ (cắm vào đầu đọc thẻ USB) giống với bộ nhớ trong khi mà nó được xuất xưởng. Cái này thấy bảo tùy vào điện thoại. Ở con Galaxy S của Samsung (và các biến thể) thì: một Primary + FAT32 (để làm bộ nhớ ngoài) và Primary +Ext4 (để cài os - 2GB-4GB). Cách dùng thì các bạn mò sẽ biết. Chú ý các phân vùng phải là Primary.
+ Bước 2: cắm thẻ nhớ đã phân vùng vào điện thoại và dùng odin (cho samsung) hoặc cái gì tương tự (cho hãng khác) để flash ROM stock vào cho máy. Bạn phải biết cái này rồi. Đừng hỏi cách flash ở đây.
+ Bước 3: chắc là máy đã có thể khởi động. Nhưng vấn đề là nó không nhận phân vùng FAT32 kia làm bộ nhớ ngoài. Phải tiến hành đổi chỗ internal và external  (đây chỉ là ảo thôi, internal chết rồi còn đâu). Nếu ai đã quen thuộc với android: adb, root, thì bước này không quá khó, với ai chưa quen thì mình cũng chịu chả biết phải chỉ dẫn từ đâu.

EDIT:
Bước 3 khá là mơ hồ nên mình sẽ nói thêm, nhưng nó áp dụng cho máy I897 của mình, và không chắc nó sẽ đúng với máy của bạn. Tuy nhiên chắc nó cũng sẽ gần giống.
Ở bước này máy đã có thể khởi động và nhưng nó không nhận vùng nhớ FAT32 làm bộ nhớ ngoài. Bạn cần tiến hành ROOT máy.
Sau đó tải Es explorer về (https://play.google.com/store/apps/details?id=com.estrongs.android.pop). Dùng phần mềm này vì nó có root explorer và text edit khá tiện.
Dùng Es explorer (đã bật chế độ root explorer) tìm đến /system/etc/ 
Mở file vold.fstab
Nội dung file đại khái như sau:
FIXME: Swap again?
# internal sdcard
dev_mount emmc /storage/sdcard1 auto /devices/platform/s3c-sdhci.2/­­­mmc_host/mmc2
# external sdcard
dev_mount sdcard /storage/sdcard0 1 /devices/platform/s3c-sdhci.0/­­­mmc_host/mmc0

Ở phiên bản android khác nhau thì nội dung file nhìn khác nhau. Nhưng dù thế nào thì cũng cứ đổi chỗ 2 cái cho nhau: đỏ đổi với đỏ, xanh đổi với xanh. Nó thành như sau:
FIXME: Swap again?
# internal sdcard
dev_mount sdcard /storage/sdcard0 auto /devices/platform/s3c-sdhci.2/­­­mmc_host/mmc2
# external sdcard
dev_mount emmc /storage/sdcard1 1 /devices/platform/s3c-sdhci.0/­­­mmc_host/mmc0

Save lại.
Restart lại điện thoại là sẽ thấy thẻ nhớ ngoài (chính là vùng FAT32)


Tuesday, May 7, 2013

Remote controller for walaoke

Phần mềm mới đã làm hòm hòm tên là Remote Controller For Walaoke (RC4W - client)

Phần mềm này dùng để điều khiển từ xa Walaoke (một chương trình phát karaoke trên PC)
Trong phần mềm RC4W có màn hình login liên quan đến hướng dẫn về cách làm layout của android.

Blog của phần mềm này ở đây: http://rc4w.blogspot.com/

Blog này không giới thiệu nhiều, chỉ nói qua qua thế thôi.

Saturday, April 20, 2013

Làm UI cho android: màn hình login, từ PSD->XML

Nói về chuyện phát triển phần mềm cho android khá là váng đầu cho người mới chuyển từ làm chương trình cho Windows với .NET như mình, làm giao diện cho chương trình bằng XML đúng là quá khó (với ai đã làm với website có lẽ sẽ dễ hơn chăng?)

Mình dò dẫm trên mạng, tìm được những giao diện cực đẹp, nhưng ở định dạng PSD (của photoshop). Người ta gọi là UI Kit. PSD dành cho dân thiết kế làm mockup nhưng với mình làm coding không biết phải "hiện thực hóa" cái giao diện đẹp đẽ trên PSD đấy trên android thì làm thế nào, mà cụ thể là bằng xml? Câu hỏi này có lẽ nhiều người mới làm (như mình) sẽ phải hỏi, không biết làm thế nào và bắt đầu từ đâu.

Dưới đây là vài ghi chép lại mình đã làm 1 file PSD layout cho phần mềm thế nào. Và chuyển nó sang XML layout android ra sao. Nó không hẳn là hướng dẫn mà chỉ là ghi chép vắn tắt.

Giao diện làm là activity Login/Connect của phần mềm đang viết.

Đầu tiên: PSD (giả sử là nhặt được ở đâu về hoặc tự làm)
 

Bên trái là giao diện làm ở PSD với các edittext, nút bấm. Bên phải là các layer được sử dụng.
PSD này mình tự làm bằng cách lấy các phần tử cơ bản của 1 cái UI Kit free ở http://designmodo.com/flat-free/, rồi lắp ghép nó lại thành như trên.

Tiếp theo làm thế nào để bê cái này vào XML layout của android.
Có lẽ có nhiều cách để làm: dùng XML Shape vẽ lại, dùng file PNG trích xuất ra từ PSD, ... (... nghĩa là không biết còn cách nào khác hay không)

Ở đây mình dùng XML.
1. Edittext:
 

Bên trái là hình hiển thị, bên phải là layer của nó. Chú ý nó có:
+ Round rectangle nền màu trắng #ffffff (vẽ bằng PS) (cái input (Ac...))
+ Stroke màu #2c81ba (xanh) (nằm ở phần effects>stroke dưới kìa)

Từ đó vào android: tạo 1 file textview_background.xml ở thư mục drawable:
XML code:

    
    
    


Ở đây làm bắt chước lại PS:
+ <solid android:color="#ffffff"/> : vẽ màu trắng
+ <corners android:radius="10dp"/>: góc tròn ở góc hình chữ nhật, 10dp là do mình sửa đổi nhìn cho đẹp chứ nó không hoàn toàn đúng như trong PS.
+ <stroke   android:width="2dp"   android:color="#2c81ba"/>: đường bao với bề dày và màu như PS.

Tóm lại là ở PS có thể vẽ ra các hình khối, đặt màu sắc, đặt opacity (độ đục) cho nó thì vào XML android có thể bắt chước được để làm cho nó giống. Cái lợi trong việc vẽ vời trên PS trước ở chỗ là nó sẽ trực quan hơn, chọn màu dễ dàng hơn (có lẽ thế - mình không phải dân thiết kế, chỉ là dân coding)

2.Tiếp tục tới cái nút ấn
 

Nút phía trên là ở trạng thái bình thường, nút dưới là khi được ấn. Hai trạng thái này được làm khác nhau ở màu nền thôi.
Để làm nó ở android: tạo 1 file btn_background.xml ở thư mục Drawable

XML Code:

    
        
            
            
            
        
    
    
        
            
            
            
        
    


Ở đây dùng <selector> để báo cho hệ thống là đây là 1 drawable phụ thuộc vào trạng thái (pressed, focused, enabled, ...).
Ở đây định nghĩa 2 <item> bên trong:
+ Một cái là <item android:state_pressed="true">, nghĩa là khi ấn vào; bên dưới nó là <shape>, để vẽ vời hình dáng giống như cách đã làm với cái edittext ở trên. Cái nút này khác là có <solid>,<corners>,<padding> nhưng không có <stroke> để vẽ đường bao.
+ Một cái khác chỉ là <item>, nghĩa là ở trạng thái khác thì nó sẽ dùng hình vẽ (<shape>) này.

3. Vẽ cái layout: đặt login_activity.xml trong thư mục layout. Ném vào các edittext, button có android:background="@drawable/....." của các file background đã làm ở trên.
Xong.

Kết quả so sánh: Từ trái sang phải: Photoshop, UI Designer của Intellij IDEA, thực tế trên điện thoại.
 


Có thể không khớp nhau vì mình chưa thực sự chú ý tới tỉ lệ, khoảng cách giữa các thành phần mà mới chỉ để ý màu và hình dáng của từng cái.
Hi vọng ghi chép ngắn gọn này có thể giúp cho ai đó về việc bê giao diện từ photoshop (ai đó thiết kế sẵn rồi) sang XML layout của android.

Cơ bản ở đây là :
+ Tìm được cách làm ra các hình vẽ ở PS và XML layout (như ở trên, vẽ hình chữ nhật, đường bao, nền, góc bo tròn như thế nào)
+ Bắt chước lại PS bằng các đoạn mã XML.
+ Cái nào không bắt chước được thì cắt nó từ PSD thành file PNG và cũng có thể đưa vào XML Layout kia được.

Download file PSD và các file XML ở đây: http://www.mediafire.com/?u26jlhgx9kz5t

Sunday, April 14, 2013

Phát triển chương trình android: váng đầu

Sau chương trình đầu tay là Chương trình chơi nhạc đơn giản, mình bỏ bẵng không học hỏi hay viết thêm chương trình nào nữa (từ tháng 10/2012 tới nay tháng 4/2013, tức là nửa năm). Nguyên nhân là mình quá bận với việc học tiếng, làm luận án thạc sĩ, và linh tinh khác. Dù sao thì lập trình cũng chỉ là thú vui thôi.

Gần đây đột nhiên có ý tưởng mới, mình lại bắt đầu học và viết lập trình cho android. Chương trình lần này yêu cầu phải có server ở PC và client trên điện thoại. Do đó dùng đồng thời Visual Studio C# để làm server trên windows và Intellij IDEA để làm chương trình cho android. Thật ra đầu tiên vẫn dùng Eclipse, nhưng eclipse thường xuyên bị những lỗi quái đản, không rõ nguyên nhân và chạy chậm kinh hoàng nên mới chuyển sang Intellij IDEA. Phần mềm này tốt hơn Eclipse nhiều lần (dù chạy cũng chậm): không hay bị lỗi quái đản, gợi ý mã tốt, hỗ trợ thiết kế UI cho android khá tốt (so với eclipse là tốt hơn nhiều). Còn Netbeans thì mình chưa dùng thử Netbeans nên không biết thế nào.

Nói tới chuyện phát triển chương trình cho android: váng đầu. Đầu tiên là IDE. IDE được giới thiệu chính trên trang developer của android là Eclipse. Nhưng dùng mới thấy phần mềm này quá cồng kềnh và lắm lỗi. Bập vào đấy rồi đúng là ác mộng với những lỗi thì thoảng bị, tắt đi mở lại lại bình thường. Thiết kế giao diện thì không phải hoàn toàn là WYSIWYG. Như mình quen làm việc với Visual Studio sang với android phải bơi trong đống xml để làm UI đúng là váng đầu 1. Đồng ý là nếu quen với xml để làm UI thì đúng là có thể sáng tạo không giới hạn. Nhưng với người mới bắt đầu, làm việc với nó đúng là !@#$%. Bỏ qua IDE, mình giờ đang dùng Intellij IDEA thấy đỡ váng đầu hơn một chút rồi. Phần mềm này cũng chậm rì nhưng soạn thảo tiện lợi hơn rất nhiều. Đặc biệt là bộ thiết kế UI tốt. Người mới dùng nên dùng phần mềm này.

Nhưng sự váng đầu thật ra chưa hết. Mình quen với lập trình trên windows, bập vào android, phải làm quen với một lô lốc các thứ mới (mà cũng đúng thôi vì nó là nền khác): đơn vị - dp, sp, px, in, dùng cái nào ? Trên PC có mỗi pixel thôi. Cái activity/service/ và việc quản lý vòng đời của nó: ví dụ khởi tạo gì đó ở onStart thì nhớ mà tắt nó ở onStop chứ không phải cái khác; nút Back, nút Home mà được ấn thì sự kiện nào sẽ đc gọi (phải biết vì nó liên quan vòng đời activity). Rồi lại còn quản lý threading (cái này giờ mình mới để ý đến vì trước đây làm với windows không cần quan tâm đến nó lắm, tất cả hoạt động xử lý làm trên luồng UI hết).

Nói chung là váng đầu nếu muốn làm lập trình cho android. Nếu mới học lập trình mà lao vào lập trình android thì chắc chắn sẽ ngất. Theo cá nhân thì có lẽ phải nắm vững kỹ thuật lập trình cơ bản (những thứ như hướng đối tượng), biết về Java, XML, thì vào với lập trình cho android mới đỡ được.

Hôm nay thử xem iPhone lập trình thế nào, nhưng tìm vào thấy bộ công cụ của nó chỉ chạy trên máy MAC. Thế thì nghỉ khỏe.

Viết vài dòng sau hơn vài tuần bắt đầu lại với Android. Đây là thú vui đau đầu. ^^