Android Bài 10: Đi Sâu Vào Layout

Posted by

Được chỉnh sửa ngày 4/1/2017.

Chào mừng các bạn quay trở lại với bài học thứ 10 trong chương trình học Android của Yellow Code Books.

Bài 7, chúng ta đã nói đến khái niệm ViewGroup, hiển nhiên như tên gọi ViewGroup dùng để chứa đựng các View hay các ViewGroup khác. Hôm nay chúng ta cùng nhau nói về các thể hiện cụ thể của ViewGroup, đó chính là các Layout.

Nếu như các bạn đã quên thì mình nhắc lại một tí, đó là:

– Từ View chúng ta xây dựng nên các Widget.
– Từ ViewGroup chúng ta xây dựng nên các Layout.

Và bài học này chúng ta cùng nhau tìm hiểu hai Layout cơ bản, đó là LinearLayoutRelativeLayout. Các layout còn lại như TableLayout, ConstraintLayout,… đã được mình nói đến ở một bài riêng, các bạn có thể xem tại đây.

Nói Đến Layout Phải Nói Đến RTL Hay LTR

Bạn biết không, hầu hết các ngôn ngữ trên trái đất này đều có cách viết từ trái sang phải, chúng ta cũng vậy vì tiếng Việt cũng như nhiều ngôn ngữ khác theo cách viết này. Cách viết từ trái sang phải như vậy được gọi là LTR (left-to-right).

Một số ít ngôn ngữ còn lại, như mình biết có ngôn ngữ Ả Rập (Arabic) có cách viết từ phải sang trái, cách viết này được gọi là RTL (right-to-left). Nhớ lại ngày xưa khi còn làm game J2ME, mình đã phải xây dựng thuật toán để hiển thị text (bằng image) cho các game với ngôn ngữ Ả Rập, tuy khó nhưng thú vị lắm các bạn. Bây giờ thì chúng ta đã được Android hỗ trợ rồi nên các bạn yên tâm sẽ không cần phải biết ngông ngữ Ả Rập là gì đâu nhé.

Tại sao mục này lại nói đến các ngôn ngữ LTR hay RTL? Bạn cũng biết Layout là các ViewGroup dùng để sắp xếp các View hay ViewGroup khác vào bên trong nó, và vì vậy các Layout này cũng sẽ chịu ảnh hưởng nhiều từ các hệ ngôn ngữ LTR hay RTL. Mình ví dụ với LinearLayout bạn sắp làm quen, sẽ có cách sắp xếp các thành phần con của nó bắt đầu từ bên trái hay bên phải là tùy vào hệ ngôn ngữ này. Hoặc hầu hết các Layout đều có điểm neo mặc định ban đầu cho thành phần con là trên-trái (top-left) hay trên-phải (top-right) cũng là tùy vào hệ ngôn ngữ này.

Thêm một ý nữa, nếu như các bài trước bạn có làm quen với các thuộc tính android:paddingLeft hay android:paddingRight hay bất kỳ các thuộc tính nào có các từ “Left”“Right” thì bạn có thể thay thế chúng bằng “Start”“End” nếu bạn muốn hỗ trợ cho các ngôn ngữ LTRRTL. Chẳng hạn android:paddingStart hay android:paddingEnd. Bạn có thể hiểu nếu LeftRight dùng để chỉ định cứng bên phía nào, thì StartEnd sẽ động hơn. Cụ thể, với ngôn ngữ LTR, Start sẽ chỉ định phía bắt đầu, tức là phía trái. Còn với ngôn ngữ RTL, Start sẽ chỉ định là bên phải. Dù vậy mình cũng không bắt buộc bạn phải xài Left/Right hay Start/End, vì Start/End chỉ được hỗ trợ từ API Level 17, nếu ứng dụng của bạn hỗ trợ hệ điều hành thấp hơn, hãy sử dụng Left/Right như mọi khi.

Nói Về Các Thuộc Tính Của Layout

Nếu như bạn đã đọc qua Bài 9 và đã biết về Khái Niệm Thuộc Tính là dùng để khai báo các biểu hiện của một widget. Và bạn cũng biết Một Số Thuộc Tính Quan Trọng bao gồm ID, layout_width, layout_height. Thì với bài hôm nay khi làm quen với layout, các khái niệm và các thuộc tính quan trọng này vẫn được áp dụng một cách trọn vẹn, không có khác biệt gì cả.

Các mục phía dưới đây sẽ hướng dẫn bạn cách sử dụng thêm các thuộc tính chuyên biệt cho từng loại layout cụ thể.

LinearLayout – Sắp Xếp Các View Nằm Cạnh Nhau

LinearLayout thường được mình mô tả cho dễ hiểu là “xếp cá mòi vào hộp”, bạn sẽ không được phép xếp con này chồng lên con kia, mà chỉ được xếp con này cạnh con kia mà thôi. Bạn có thể chỉ định việc xếp các con cá nằm cạnh nhau theo một chiều ngang, hoặc một chiều dọc.

Các Thuộc Tính Thường Dùng Của LinearLayout

Ngoài các thuộc tính dùng như widget được liệt kê ở mục trên đây, thì LinearLayout còn có các thuộc tính riêng để chỉ định việc sắp xếp “cá mòi” vào trong nó như thế nào.

Vậy mình tổng hợp lại bạn cần quan tâm đến các thuộc tính sau:

– Hướng “xếp cá” (orientation).
– Trọng số (weight).
– Một thuộc tính dịch ra tiếng Việt hơi chuối đó là lực hấp dẫn (gravity).
– Ngoài ra còn có một điều không phải là thuộc tính nhưng cũng được liệt kê trong đây, đó là việc phân bổ không gian cho view con (fill).

Chúng ta cùng làm quen với từng thuộc tính quan trọng này sau đây.

Thuộc Tính Hướng (Orientation)

Như mình đã nói, LinearLayout chỉ xếp các thành phần con nằm cạnh nhau theo một trong hai hướng là ngang hay dọc. Thuộc tính XML android:orientation sẽ giúp bạn định nghĩa được điều đó, tham số của thuộc tính này sẽ là một trong hai giá trị.

– android:orientation=”horizontal” – Giúp xếp các thành phần con nằm cạnh nhau theo phương ngang.
– android:orientation=”vertical” – Giúp xếp vác thành phần con nằm cạnh nhau theo phương dọc.

Tương tự, nếu muốn dùng thuộc tính hướng cho Java code bạn có thể dùng hàm setOrientation() với tham số truyền vào là một hằng số LinearLayout.HORIZONTAL hoặc LinearLayout.VERTICAL.

Phân Bổ Không Gian Cho View Con (Fill)

Như được nói trước, đây không phải một thuộc tính, nó là một nguyên tắc của LinearLayout. Bạn hãy thử tưởng tượng như vầy, bạn có một LinearLayout mà bên trong nó có 3 view con (view ở đây nói chung là View hoặc ViewGroup) được xếp theo nguyên tắc horizontal, tức xếp lớp theo chiều ngang. Giả sử có một view con có thuộc tính android:layout_width=”match_parent”, tức là view con này có chiều rộng hết LinearLayout cha luôn rồi, thì các view còn lại sẽ hiển thị như thế nào?

Câu trả lời là LinearLayout sẽ dành không gian cho con kiểu “ưu tiên con cả trước”, tức là anh nào được đưa vào trước sẽ được ưu tiên không gian trước, anh nào vào sau sẽ… ra khỏi màn hình mà nằm nếu không đủ chỗ, tức là người dùng sẽ không thấy anh này đâu cả.

Bạn thấy như hình ví dụ sau, mình cố tình thiết lập cho cả 3 view con đều dành không gian rộng 200dp, như vậy ắt sẽ có view phải ra khỏi màn hình, đó là view có background màu xanh dương.

screen-shot-2016-11-14-at-14-04-19

Thuộc Tính Trọng Số (Weight)

Sau khi xem ví dụ trên đây về việc phân bổ không gian cho view con, ắt hẳn bạn hơi bị thắc mắc, câu hỏi bạn đặt ra bấy giờ là liệu có cách nào đó, với một sự phân chia hợp lý hơn, sao cho tất cả các view con đều có thể hiển thị được trên màn hình?

Chà khó quá… nhưng thật dễ dàng đối với LinearLayout, Google đã tính trước câu hỏi của bạn nên mới ra khái niệm weight.

Nói một cách đầy đủ, weight sẽ giúp bạn thiết lập trọng số cho các view con để sử dụng phần không gian trống còn lại của một LinearLayout, với mỗi trọng số khác 0, phần không gian trống còn lại của LinearLayout sẽ được chia ra cho các view con theo trọng số đó. Để sử dụng trọng số weight, bạn không cần dùng đến layout_width hay layout_height cho view con tương ứng nữa, chúng ta xem qua cách sử dụng weight như sau trước khi xem ví dụ bên dưới.

– Với LinearLayout có orientationhorizontal, bạn nên set android:layout_width của view con về 0. Với LinearLayout có orientationvertical, bạn set android:layout_height của view con về 0.
– Khai báo android:layout_weight cho view con đó và cho nó một con số (số nguyên hay số thực đều được, và không kèm theo dp hay dip vào giá trị này).

Bạn có thể xem ví dụ ở hình dưới, mình đã sửa lại bằng cách khai báo weight cho các view con lần lượt là 2-1-1. Khi đó view đầu tiên sẽ có chiều rộng sao cho bằng 2 lần các view còn lại.

screen-shot-2016-11-14-at-14-57-18

Để bạn dễ hiểu hơn, mình tiếp tục thử nghiệm bằng cách đổi lại weight cho chúng lần lượt là 2-3-1. Bạn sẽ thấy view màu đỏ với weight là 2 sẽ chiếm không gian rộng gấp 2 lần so với view xanh dương với weight là 1. Tương tự, view màu xanh lá với weight là 3 sẽ rộng gấp 3 lần so với view xanh dương với weight là 1. Bạn hiểu độ tương quan của các trọng số weight chưa nào?

screen-shot-2016-11-14-at-16-11-25

Với cách set trọng số weight như trên thì dù cho LinearLayout có không gian như thế nào thì view con cũng sẽ tìm cách lấp đầy không gian trống đó. Nhưng nếu bạn muốn chừa không gian trống cho mục đích nào đó, bạn có thể thiết lập một giá trị android:weightSum cho LinearLayout rồi set weight cho các view con của nó sao cho tổng giá trị weight nhỏ hơn weightSum như hình bên dưới đây.

Như hình thì bạn thấy mình set giá trị weightSum cho LinearLayout là 8, mà tổng weight của các view con chỉ là 6 thôi, như vậy sẽ còn dư 2 weight không có con nào được fill vào, nên nó mới trống như vậy.

screen-shot-2016-11-14-at-16-24-45

Thuộc Tính Lực Hấp Dẫn (Gravity)

Chắc bạn còn nhớ ở bài trước widget cũng có dùng đến thuộc tính android:gravity này. LinearLayout của bài hôm nay cũng sử dụng thuộc tính này giống như vậy để canh chỉnh cho các thành phần con của mình.

Mặc định thì các thành phần con bên trong LinearLayout sẽ được “hút” về start-top theo “lực hấp dẫn” mặc định (như đã nói ở trên, start sẽ là left hay right là tùy vào ngôn ngữ LTR hay RTL).

Ví dụ sau mình set android:gravity=”bottom” sẽ làm các view con bị hút (neo) hết xuống dưới so với layout cha.

screen-shot-2016-11-14-at-17-25-27

Bạn cứ từ từ làm quen hết tất cả các giá trị gravity này. Bạn cũng có thể kết hợp nhiều giá trị gravity vào cùng một khai báo thuộc tính bằng cách thêm vào ký tự “|” như này android:gravity=”right|bottom”.

Các Thuộc Tính Thêm Vào Cho View Con

Một điều thú vị là khi các View (hay ViewGroup) khác nằm bên trong một LinearLayout, chúng sẽ có thêm một vài thuộc tính, chủ yếu là canh chỉnh vị trí của bản thân nó so với không gian của layout cha.

Với LinearLayout thì chúng ta chỉ cần quan tâm đến 2 thuộc tính được thêm vào thành phần con, trong đó có thuộc tính weight đã được nói trước ở trên, thuộc tính còn lại như sau.

– android:layout_gravity – Không cần giải thích dài dòng, thuộc tính này dùng chính xác như android:gravity của LinearLayout được nói ngay trên đây. Nếu như android:gravity ở LinearLayout sẽ áp dụng lực hút (hay còn gọi là điểm neo) cho tất cả các con của nó, thì android:layout_gravity dùng cho mỗi thành phần con sẽ có tác dụng neo cho chính thành phần con này mà thôi. Bạn nhớ là tên thuộc tính hơi khác nhau chút, layout_gravitygravity nhé.

Thực Hành Xây Dựng Màn Hình Empty Của TourNote Bằng LinearLayout

Sau khi thực hành qua các bài trước, giao diện đầu tiên khi mở TourNote ra sẽ trông như thế này.

device-2016-11-15-141631

Giờ thì bạn hãy quên đi layout nào đang chứa TextViewImageView mà bạn đã thêm vào trước đó. Nhiệm vụ của bài thực hành này là sử dụng LinearLayout để bao lấy 2 widget này, sao cho chúng vẫn hiển thị đúng như thiết kế ban đầu.

Để bắt đầu, bạn hãy mở lại project TourNote, mở file activity_main.xml ra. Trước tiên bạn hãy sửa lại khai báo RelativeLayout thành LinearLayout, bạn nên nhớ sửa cả ở mở tag và đóng tag. Sau khi sửa xong, bạn sẽ nhận thông báo lỗi từ hệ thống, vì LinearLayout cần thuộc tính orientation khi có từ 2 thành phần con trở lên, chúng ta sẽ thêm vào sau.

Screen Shot 2016-11-15 at 14.28.13.png

Cửa sổ Preview lúc bấy giờ cũng cho ra hình ảnh ứng dụng bị sai. Đừng lo lắng, giờ chúng ta thêm vào orientation cho LinearLayout. À mà sẵn tiện chúng ta bỏ luôn cả các thuộc tính android:layout_centerInParent, android:layout_belowandroid:layout_centerHorizontal ra khỏi các widget, chúng là các thuộc tính cho RelativeLayout mà chúng ta sẽ nói đến ở mục dưới đây. Code giao diện của chúng ta như sau.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.yellowcode.tournote.MainActivity">

    <TextView
        android:id="@+id/activity_main_tv_empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="4dp"
        android:text="@string/empty_note"
        android:textSize="15sp" />

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginTop="8dp"
        android:scaleType="fitCenter"
        android:src="@drawable/empty_note" />

</LinearLayout>

Cửa sổ Preview cho chúng ta cái nhìn giao diện giả lập, chà chưa đúng ý nhỉ, chúng ta cần điều chỉnh sao cho các thành phần này canh vào giữa màn hình.

screen-shot-2016-11-16-at-08-44-14

Như vậy bạn cần thêm vào thuộc tính gravity cho LinearLayout như sau.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.yellowcode.tournote.MainActivity">

    <TextView
        android:id="@+id/activity_main_tv_empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="4dp"
        android:text="@string/empty_note"
        android:textSize="15sp" />

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginTop="8dp"
        android:scaleType="fitCenter"
        android:src="@drawable/empty_note" />

</LinearLayout>

Kết quả khi run ứng dụng sẽ như chúng ta mong muốn.

device-2016-11-15-141631

RelativeLayout – Sắp Xếp Các View Theo Mối Quan Hệ

Nghe đến mối quan hệ chắc bạn sẽ nghĩ đến họ hàng hay quen biết gì đó. Thực chất RelativeLayout sẽ sắp xếp các con của nó theo một trật tự… tự do, mỗi thành phần con sẽ tự quyết định cho mình một chỗ đứng. Cách thức chọn chỗ đứng của các thành phần con là nói cho RelativeLayout biết mình đứng như thế nào so với chính layout cha hay so với các thành phần kế cận mà thôi, đó cũng chính là khái niệm mối quan hệ trong RelativeLayout.

Các Thuộc Tính Thêm Vào Cho View Con

Về cơ bản thì RelativeLayout có tính “dân chủ” hơn LinearLayout, mọi quyết định về vị trí đều ưu tiên cho các thành phần con tự chọn. Chính vì vậy mà với RelativeLayout bạn sẽ hầu như không cần quan tâm đến thuộc tính của chính nó, mà quan tâm đến các thuộc tính thêm vào cho các thành phần con của nó. Và bởi vì có rất nhiều thuộc tính được thêm vào thành phần con, nên mình sẽ tách các thuộc tính này làm nhiều nhóm như sau.

Quyết Định Vị Trí So Với RelativeLayout Cha

Tất cả các thuộc tính dưới đây chỉ cần truyền vào true hay false thể hiện rằng bạn có đồng ý với việc canh chỉnh này hay không mà thôi.

– android:layout_alignParentTop – Chỉ định đỉnh của thành phần này sẽ được canh theo đỉnh của layout cha.
– android:layout_alignParentBottom – Ngược lại, chỉ định đáy của thành phần này sẽ được canh theo đáy của layout cha.
– android:layout_alignParentStart – Chỉ định cạnh start của thành phần này sẽ được canh theo cạnh start của layout cha, dùng cho việc phân biệt RTL hay LTR được nói ở đầu bài hôm nay.
– android:layout_alignParentEnd – Chỉ định cạnh end của thành phần này sẽ được canh theo cạnh end của layout cha, dùng cho việc phân biệt RTL hay LTR được nói ở đầu bài hôm nay.
– android:layout_alignParentLeft – Chỉ định cạnh trái của thành phần này sẽ được canh theo cạnh trái của layout cha, không phân biệt RTL hay LTR.
– android:layout_alignParentRight – Chỉ định cạnh phải của thành phần này sẽ được canh theo cạnh phải của layout cha, không phân biệt RTL hay LTR.
– android:layout_centerHorizontal – Chỉ định thành phần này được đặt ngay giữa theo chiều ngang so với layout cha.
– android:layout_centerVertical – Chỉ định thành phần này được đặt ngay giữa theo chiều dọc so với layout cha.
– android:layout_centerInParent – Chỉ định thành phần này được đặt ngay giữa theo cả hai chiều ngang và dọc so với layout cha.

Quyết Định Vị Trí So Với Các Widget Khác

Tất cả các thuộc tính dưới đây cần phải truyền vào một ID @id/ hay @+id/ (nếu không rõ phần sử dụng ID này, bạn có thể đọc ở Bài 9, mục Truy Xuất Đến ID Của Một View).

– android:layout_alignTop –  Chỉ định đỉnh của thành phần này sẽ được canh theo đỉnh của thành phần gọi đến bằng ID.
– android:layout_alignBottom – Chỉ định đáy của thành phần này sẽ được canh theo đáy của thành phần gọi đến bằng ID.
– android:layout_alignStart – Chỉ định cạnh start của thành phần này sẽ được canh theo cạnh start của thành phần gọi đến bằng ID.
– android:layout_alignEnd – Chỉ định cạnh end của thành phần này sẽ được canh theo cạnh end của thành phần gọi đến bằng ID.
– android:layout_alignBaseline – Chỉ định baseline của thành phần này sẽ được canh theo baseline của thành phần gọi đến bằng ID. Baseline này bạn không nhìn thấy được, dùng để canh chỉnh cho text hiển thị bên trong widget, do đó sẽ hữu dụng khi canh chỉnh các TextView với nhau).
– android:layout_above – Chỉ định thành phần này sẽ nằm ở trên so với thành phần gọi đến bằng ID.
– android:layout_below – Chỉ định thành phần này sẽ nằm dưới so với thành phần gọi đến bằng ID.
– android:layout_toStartOf – Chỉ định thành phần này sẽ nằm bên phía start so với thành phần gọi đến bằng ID.
– android:layout_toEndOf – Chỉ định thành phần này sẽ nằm bên phía end so với thành phần gọi đến bằng ID.
– android:layout_toLeftOf – Chỉ định thành phần này sẽ nằm bên phía trái so với thành phần gọi đến bằng ID.
– android:layout_toRightOf – Chỉ định thành phần này sẽ nằm bên phía phải so với thành phần gọi đến bằng ID.

Thực Hành Xây Dựng Màn Hình Empty Của TourNote Bằng RelativeLayout

Giờ bạn hãy “đập” giao diện activity_main.xml một lần nữa, bạn hãy chuyển từ LinearLayout về lại thành RelativeLayout.

Sau đó bạn hãy bỏ qua các thuộc tính không cần thiết với RelativeLayout, như android:gravityandroid:orientation. Code sẽ trông như sau.

screen-shot-2016-11-16-at-15-56-52

Còn giao diện ở cửa sổ Preview sẽ trông như sau.

screen-shot-2016-11-16-at-15-59-31

Bạn thấy rằng khi không chỉ định vị trí, thì các thành phần con sẽ tự động để chồng lên nhau ở điểm trên-trái so với layout cha (hay có thể nói vị trí start-trên). Chúng ta thêm các thuộc tính vào cho các view con, sao cho chúng canh chỉnh vào giữa so với cha, và image phải nằm dưới text, như sau.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.yellowcode.tournote.MainActivity">

    <TextView
        android:id="@+id/activity_main_tv_empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:padding="4dp"
        android:text="@string/empty_note"
        android:textSize="15sp" />

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_below="@id/activity_main_tv_empty"
        android:layout_centerInParent="true"
        android:layout_marginTop="8dp"
        android:scaleType="fitCenter"
        android:src="@drawable/empty_note" />

</RelativeLayout>

Kết quả run lên như thế nào tự bạn kiểm chứng nhé.

Bạn vừa xem qua cách sử dụng 2 layout phổ biến nhất hiện nay là LinearLayoutRelativeLayout, mình có một bài viết riêng để nói đầy đủ tất cả các layout trong Android, các bạn có thể tham khảo bài Tìm hiểu các layout trong Android.

Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy đánh giá 5 sao nếu thấy thích bài viết, hãy comment bên dưới nếu có thắc mắc, hãy để lại địa chỉ email của bạn để nhận được thông báo mới nhất khi có bài viết mới, và nhớ chia sẻ các bài viết của Yellow Code Books đến nhiều người khác nữa nhé.

Bài Kế Tiếp

Bạn sẽ được biết cách khai báo và sử dụng build.gradle, dựa trên kiến thức này, bạn sẽ biết cách tìm kiếm và sử dụng các thư viện được viết sẵn cho Android (mà không để sẵn trong Android Platform) hoặc các thư viện của bên thứ ba (Third Party), làm cho ứng dụng của bạn thêm dễ dàng để xây dựng, và trông chuyên nghiệp hơn.

Advertisements
Rating: 5.0/5. From 10 votes.
Please wait...

7 comments

    1. Chào Bạn :
      Lâu nay Mình quay lại đọc từ đầu để nắm sâu hơn bài học và củng cố kiến thức vững hơn để đọc các bài sau được dễ hơn.
      Đọc và thực hành lại đến bài 10 thì có các dòng lệnh sau báo lỗi nhờ Bạn giải thích ý nghĩa của các dòng lệnh này cho Mình với và cho biết các khắc phục :
      android:paddingBottom=”@dimen/activity_vertical_margin”
      android:paddingLeft=”@dimen/activity_horizontal_margin”
      android:paddingRight=”@dimen/activity_horizontal_margin”
      android:paddingTop=”@dimen/activity_vertical_margin”
      Cám ơn Bạn nhiều

      1. Chào bạn Thuận. Yeah cảm ơn bạn đã nhắc, do Android có một sự thay đổi lớn khi các bạn tạo mới một project bây giờ, nó không còn “khớp” với những gì mình viết trước đây nữa, mình sẽ điều chỉnh các bài blog sớm hơn.
        Với lỗi này của bạn là do hiện tại khi tạo mới project Android sẽ không tạo sẵn các thông số này ở resource dimen nữa. Bạn có thể đọc trước Bài 18, ở đó mình có nói về cách sử dụng dimen, cách khai báo bổ sung các thông số mà bạn đang bị báo lỗi do thiếu. Mình tin chắc thông qua lỗi này của bạn, bạn sẽ nắm vững project Android hơn nữa đấy.
        Nếu còn vấn đề gì bạn hãy tiếp tục để lại comment cho mình nhé.

Gửi phản hồi