Giải quyết việc tự động tạo Fragment Layout trong các phiên bản ADT mới

4 bình luận

Lời dẫn: Sau khi nâng cấp ADT phiên bản 22.6.x, một điều khó chịu xảy ra đối với nhiều lập trình viên, đó là Google có xu hướng cưỡng ép chúng ta phải làm việc với Fragment Layout và hệ thống điều hướng đặc trưng của Android như ViewPager. Chưa hết, ADT phiên bản mới còn làm project trở nên lộn xộn hơn một chút bằng cách tự động thêm thư viện appcompat_v7 vào project trong trường hợp bạn muốn build ứng dụng cho các API thấp, tất nhiên điều này là hợp lý vì những API thấp không làm việc tốt với Fragment Layout và ViewPager. Trong bài viết này, txnam.net sẽ gợi ý những cách bạn xử lý những điều khó chịu này.

Update:

Cuối tháng 6/2014, Google đã update ADT lên phiên bản mới 23.x.x, trong phiên bản này bổ sung thêm lựa chọn cho phép chúng ta bắt đầu project mới với một “blank activity” hoặc “blank activity with fragment”. Như vậy Google đã lắng nghe “dư luận” của các lập trình viên và có điều chỉnh kịp thời; chúng ta không cần điều chỉnh gì thêm nữa. Tuy nhiên, một số kiến thức trong bài viết này có thể vẫn gợi ý cho các bạn muốn tự tạo cho mình một số thư viện các Activity của riêng bạn (chẳng hạn như Activity with welcome screen, Sign-in Activity,…)

Giao diện mới bắt phải tạo Fragment Layout

Giao diện mới bắt phải tạo Fragment Layout

Fragment Layout và ViewPager dùng làm gì?

Khái niệm Fragment Layout được giới thiệu từ phiên bản Android 3.0 (API 11) nhưng chỉ được chính thức đưa vào SDK phiên bản API 14. Từ Android 3.0, Google bắt đầu đưa Android lên máy tính bảng (những phiên bản trước được thiết kế cho trải nghiệm trên điện thoại); với máy tính bảng, thế giới thiết bị Android xuất hiện loại màn hình rộng và có rất nhiều kích cỡ, điều này làm nảy sinh vấn đề tương thích màn hình khi ứng dụng chạy trên máy tính bảng và điện thoại di động.

Fragment Layout là lời giải của Google cho vấn đề này, trong đó các vùng màn hình có thể được chia nhỏ thành các Fragment (và chuyển qua lại dựa trên hệ thống menu hoặc thao tác vuốt màn hình), trường hợp màn hình đủ to, các Fragment này sẽ ghép với nhau và cùng hiện diện trên một layout gốc. ViewPager là gợi ý của Google trong việc điều khiển qua lại giữa các thành phần giao diện.

Vấn đề nảy sinh là không phải nhà phát triển nào cũng thích giải pháp của Google, điều này dẫn tới việc trải nghiệm mà các ứng dụng Android đem tới cho người dùng trở nên thiếu nhất quán; cuối cùng, Google quyết định việc tạo Fragment Layout nên là mặc định mỗi khi tạo một Activity mới. Kết quả chính là những điều khó chịu mà chúng ta đã thấy trong ADT phiên bản 22.6.x:

  • Mặc định yêu cầu nhập tên và tạo Fragment Layout khi tạo Activity mới
  • Một Activity mặc định thay vì chỉ có một file java và một file layout thì bây giờ sẽ có thêm một file layout nữa
  • Mã nguồn mặc định sẽ thêm dài dòng, vì có thêm những đoạn mã giúp làm việc với Fragment Layout
  • Nếu ứng dụng dịch với những API thấp, sẽ tự động bổ sung thêm một thư viện mới giúp làm việc tốt với Fragment Layout và ViewPager

Bây giờ chúng ta hãy xem xét các giải pháp giải quyết điều khó chịu này.

Đầu hàng Google

Đây là giải pháp nhẹ nhàng nhất, chúng ta nên gạt bỏ những khó chịu và tập sử dụng Fragment Layout như Google muốn. Nói cho cùng thì Google cũng chỉ muốn điều tốt cho người sử dụng và lập trình viên. Việc cứ khăng khăng từ chối sử dụng các điều khiển dạng fragment rất có thể làm chúng ta bỏ lỡ chuyển tàu những ứng dụng mới sẽ được Google phát triển sau này.

Sử dụng lại bản ADT cũ

Đây là giải pháp hơi cực đoan, tuy nhiên không phải suy nghĩ gì nhiều, khi nào bắt buộc phải nâng cấp ADT thì sẽ tính sau, còn giờ thì hãy làm việc theo cách cũ đã! Nếu bạn quyết như vậy, có thể download bản ADT 22.3.0 tại ĐÂY, sau đó mở Eclipse uninstall bản ADT hiện tại và cài bản cũ bạn vừa tải về.

ADT tạo ra thêm một file layout mới kèm theo hàng loạt mã hỗ trợ dài dòng

ADT tạo ra thêm một file layout mới kèm theo hàng loạt mã hỗ trợ dài dòng

Cứ để tạo Fragment Layout rồi xóa đi

Cách làm thông thường nhất là sửa lại những gì ADT tự động tạo ra, điều này rất bình thường, ngay cả trong các bản ADT cũ, nhiều lập trình viên vẫn thường xuyên xóa đi những đoạn mã không cần thiết do ADT tự sinh ra. Trong tình huống mới thì việc này nặng nề hơn một chút, bạn sẽ phải thực hiện:

  • Xóa trắng nội dung của activity_main.xml
  • Copy toàn bộ nội dung từ fragment_main.xml sang activity_main.xml
  • Xóa file fragment_main.xml
  • Xóa tất cả các phương thức, class con trong MainActivity ngoại trừ onCreate
  • Sửa lại onCreate, loại bỏ tất cả chỉ giữ lại 2 dòng đầu của phương thức

Đấy là trong tình huống thông thường, bạn cần làm khác đi một chút nếu bạn đặt tên khác cho fragment và activity, sửa như vậy quả là hơi nhiều đúng không nhỉ?

Chỉnh sửa Blank Activity template

Với những bạn không thích phải chỉnh sửa quá nhiều như phương án trên, chúng ta có thể nghĩ tới việc động tay chân một chút trên Blank Activity template của ADT.

Chúng ta biết rằng giao diện tạo project của ADT sử dụng các mẫu được viết sẵn, chính các mẫu này ràng buộc việc chúng ta phải nhập tên cho Fragment Layout, vậy tại sao chúng ta không sửa những mẫu này đi để chúng không có những yêu cầu như vậy nữa? Cách làm như sau:

  • Từ thư mục cài đặt Android SDK vào thư mục “tools/templates/activities/BlankActivity
  • Bỏ yêu cầu có tên cho Fragment Layout: mở file “template.xml“, tìm phần tham số của FragmentLayout (tìm chuỗi id=”fragmentLayoutName”), sửa lại ràng buộc constraints=”layout|unique|nonempty” thành constraints=”empty”
  • Bỏ việc tạo file fragment layout xml: mở file “recipie.xml.ftl” xóa dòng 56 & 57, bạn có thể xóa luôn dòng 81 (yêu cầu mở file fragment layout sau khi tạo xong project)
  • Điều chỉnh lại file java mặc định: vào tiếp thư mục “root/src/app_package” mở file “SampleActivity.java.ftl“, xóa đi 2 dòng có chứa “#inlclude” ở cuối file (xóa cả dòng luôn nhé)
  • Điều chỉnh lại file layout xml mặc định: trở ra thư mục BlankActivity rồi vào tiếp thư mục “root/res/layout“, copy toàn bộ nội dung trong file “fragment_simple.xml.ftl” đè vào nội dung của file “activity_fragment_container.xml.ftl

Vậy là xong, tuy hơi lằng nhằng, nhưng từ giờ trở đi mọi việc như cũ, khác biệt duy nhất là bạn đừng nhập tên cho fragment layout nữa, hãy để trống.

Tự tạo một Blank Activity của bạn

Đây là giải pháp được txnam.net đề xuất cho các bạn; thay vì chỉnh sửa BlankActivity, chúng ta hãy tạo thêm một BlankActivity nữa nhưng theo phong cách của chúng ta. Cách làm rất đơn giản như sau:

  • Tải file template được tạo sẵn theo phong cách cũ: BlankAcvitityOld
  • Bên trong file có 1 thư mục tên BlankActivityOld, hãy giải nén và copy toàn bộ thư mục vào thư  mục “tools/templates/activities/” (tức là để nó ngang hàng với thư mục BlankActivity hiện tại, bạn có thể đổi dùng tên khác chứ không nhất thiết phải là BlankActivityOld
  • Vậy là xong, giờ hãy bật Eclipse và xem thành quả, sau khi nhập thông tin về project, màn hình tạo activity có thêm một lựa chọn mới “Really Blank Activity”, hãy chọn loại activity này nếu bạn ghét Fragment Layout

txnam.net

4 bình luận cho Giải quyết việc tự động tạo Fragment Layout trong các phiên bản ADT mới

  • nh0ckti  says:

    mình có 1 cách là khi tạo mới proj thì chỗ Minimum và Target mình để API là 16 luôn….như vậy nó sẽ ko sinh ra thêm

  • binh  says:

    con mot giai phap khac ma chung ta ko can phai lam gi ca. khi tao new project android chung ta ko khoi tao activity main he thong se ko tu tao thu vien appcompatv7

    • Quanghuong  says:

      Thế để vậy không lập trình gì sao. Không tạo nhưng sau rồi thêm một activity nó cũng tự tạo ra mà thôi.

  • dungnh  says:

    hai cách cuối rất hay nhưng vẫn chưa sửa được file style.xml trong thư mục values vì file manifest.xml nó vẫn sử dụng theme mới được định nghĩa trong appcompat v7,
    Nếu sửa được file manifest.xml và file style.xml thì tốt hơn khi đó có thể xóa cái project tên appcompat_v7 và values-v11, values-v14 nó sẽ gọn gàng và không báo lỗi gì cả .

Leave a Reply to Quanghuong Cancel reply