Được chỉnh sửa ngày 7/4/2017.
Chào mừng các bạn đến với các bài viết bổ sung cho chương trình học Android của Yellow Code Books.
Chắc các bạn đã đọc qua các bài học Bài 7 và Bài 9 rồi, đây là các bài viết giúp chúng ta bước đầu làm quen với khái niệm widget, và cũng đã tiếp cận với một vài widget cơ bản nhất. Bài viết bổ sung hôm nay sẽ liệt kê các widget cơ bản còn lại mà hai bài học trên chưa có dịp nhắc đến. Các bạn cùng xem qua nào.
TextView – Nơi Hiển Thị Các Label
Widget TextView đã được mình nói đến rất cụ thể ở Bài 9, bao gồm các thuộc tính thường dùng trong XML, và cả bài thực hành liên quan đến TextView này nữa, nên bài này mình sẽ không nhắc lại cụ thể nhé.
Button – Hãy Click Vào Tôi
Button là một widget chuyên nhận sự kiện click vào và… sẽ có chuyện gì đó xảy ra. Việc đón nhận sự kiện nhấn vào, và các biểu diễn UI theo trạng thái nhấn là của hệ thống, còn bạn sẽ phải định nghĩa chuyện gì sẽ diễn ra sau đó khi người dùng nhấn vào nó.
Button là con của TextView, nên những thuộc tính được nói ở TextView trên đây đều có ở Button cả.
Các thuộc tính thường dùng của Button
Những thuộc tính mình ghi là “đã được nói đến” ở bên dưới đây là những thuộc tính đã nói rõ trong bài số 9 nhé.
– android:id – Đã được nói đến.
– android:layout_width – Đã được nói đến.
– android:layput_height – Đã được nói đến.
– android:background – Đã được nói đến.
– android:padding – Đã được nói đến.
– android:onClick – Dùng xây dựng chuyện gì đó xảy ra cho ứng dụng khi người dùng click vào Button (thực chất ở cấp độ View cũng đã có thuộc tính này, Button chỉ kế thừa và làm cho onClick được dùng thường xuyên hơn thôi). Thuộc tính onClick này sẽ được nói đến ở ví dụ dưới đây.
– android:text – Kế thừa từ TextView, dùng để hiển thị text.
– android:textAllCaps – Thông thường Button sẽ tự in hoa hết các ký tự text, thuộc tính này dùng để bật/tắt việc in hoa này.
Đón Nhận Sự Kiện Click
Như mình có nói trên đây, việc đón nhận để biết được khi nào người dùng click/touch vào button là chuyện của hệ thống. Việc của chúng ta là định nghĩa các logic liên quan khi có sự kiện này xảy ra. Chẳng hạn như việc sẽ mở ra một màn hình mới, xuất hiện câu thông báo, ra lệnh cho map mở ra hướng dẫn chỉ đường, gửi một nội dung lên server, share một bài viết lên mạng xã hội,…
Trong Android có nhiều cách để bạn đón nhận sự kiện click từ hệ thống, mình liệt kê ra đây hai cách, bạn nên chọn cách nào đó mà bạn cho là dễ nhất với bạn nhé.
Nhận Sự Kiện Thông Qua Thuộc Tính onClick
Chúng ta sẽ vận dụng thuộc tính onClick được nhắc đến ở mục trên để nhận sự kiện click lên Button này.
Đầu tiên bạn hãy tự tạo mới một project để test, sau đó ở activity_main.xml bạn khai báo một Button như sau.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="showMessage" android:text="@string/button" /> </RelativeLayout>
Trong đó @string/button sẽ được khai báo trong strings.xml với nội dung là “Button Sample”, nếu bạn không biết cách khai báo một string như thế nào trong hệ thống thì có thể xem qua Bài 15 để biết cách sử dụng cụ thể loại resource này.
Bạn để ý thấy ở khai báo trên có thuộc tính android:onClick=”showMessage”. Thuộc tính này cho phép bạn định nghĩa ra một tên hàm bất kỳ, như ví dụ trên đây mình định nghĩa ra một cái tên showMessage.
Sau đó với Activity đang gọi đến file XML này, ví dụ như MainActivity.java, bạn khai báo một hàm như sau.
/** Called when the user touches the button */ public void showMessage(View view) { // Do something in response to button click }
Bạn chú ý tên hàm showMessage() phải đúng với showMessage mà bạn đã đặt ở thuộc tính onClick trên đây. Tham số truyền vào trong hàm này ở Java code yêu cầu phải là một View. Tham số View truyền vào này chính là Button mà người dùng sẽ click.
Tóm lại là, nếu Button button1 ở file XML được click, thì hàm showMessage() ở Java code tương ứng này sẽ được gọi, việc tiếp theo là bạn phải làm gì đó trong hàm này. Chúng ta sẽ thử in ra một Toast message như sau.
/** Called when the user touches the button */ public void showMessage(View view) { // Do something in response to button click Toast.makeText(this, "Your button is touched!!!", Toast.LENGTH_SHORT).show(); }
Khi bạn run ứng dụng lên, và click (touch) vào Button, hãy để ý một Toast xuất hiện ở phía dưới của màn hình Android nhé.
Nhận Sự Kiện Qua Việc Lắng Nghe OnClickListener
Cách lắng nghe bằng cách định nghĩa thuộc tính onClick trên đây khá hay, tuy nhiên nó hữu dụng khi bạn đã tạo Button sẵn trong XML. Nếu bạn muốn tạo một button bằng Java code, thì cách sau lại hiệu quả hơn vì nó không cần một XML đi kèm. Tuy nhiên nếu với ví dụ trên khi đã khai báo một Button trong XML rồi thì bạn vẫn hoàn toàn có thể sử dụng cách này để lắng nghe sự kiện click nếu thích.
Để làm được vậy thì bạn phải kết nối Button ở Java code đến Button ở XML (nếu có định nghĩa trước ở XML) thông qua một ID. Sau đó bạn gọi hàm setOnClickListener, khai báo sự kiện View.OnclickListener rồi định nghĩa gì đó (mình lại dùng câu lệnh Toast) để test sự kiện click này.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnDemo = (Button) findViewById(R.id.button1); btnDemo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this, "Your button is touched!!!", Toast.LENGTH_SHORT).show(); } }); }
ImageView – Hiển Thị Ảnh Đơn Thuần
ImageView | Android Developers
ImageView cũng đã được nói rất chi tiết ở Bài 9, nên bài này mình cũng không nói lại.
ImageButton – Con Của ImageView Và Buttons?
ImageButton | Android Developers
ImageButton đúng là con của ImageView thật, nên nó sẽ có các kế thừa từ ImageView. Tuy nhiên ImageButton không phải con của Button đâu nhé, trong khái niệm OOP không có một đối tượng nào có thể là con của hai đối tượng khác cả.
Vậy nói một cách chính xác hơn, thì ImageButton là con của ImageView và có nét giống với một Button. Nói về cách sử dụng, thì ImageButton được dùng như là một Button, nhưng thay vì hiển thị text như Button thông thường, thì ImageButton lại có khả năng hiển thị ảnh tốt như một ImageView vậy.
Bạn có thể thắc mắc rằng Button thông thường cũng có thuộc tính android:background dùng để hiển thị ảnh được vậy. Đúng vậy, nhưng với ImageButton bạn còn dùng được cả thuộc tính android:src vốn được kế thừa từ ImageView nữa. Và với thuộc tính android:src này thì bạn có thể áp dụng các cách scale từ thuộc tính android:scaleType để làm cho ImageButton của bạn thêm pro hơn so với Button thông thường. Bạn đã rõ rồi đúng không nào.
Ví Dụ ImageButton
Mình xây dựng một ImageButton như sau, bạn có thể thấy là cách nhận sự kiện click của ImageButton hoàn toàn giống như với Button vậy.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageButton android:id="@+id/imageButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" android:onClick="showMessage"/> </RelativeLayout>
Hình dưới đây là khi bạn run ứng dụng lên, rồi click vào ImageButton.
EditText – Người Dùng Ơi Hãy Nhập Vào Cái Gì Đó
EditText là đối tượng con của TextView, như vậy về bản chất EditText cũng như là một label, nhưng label này cho phép người dùng có thể nhập thông tin vào được, chẳng hạn như bạn thấy có các ứng dụng đòi hỏi nhập username, password, tên, ngày tháng năm sinh,… tất cả đều phải dùng đến EditText cả.
Các Thuộc Tính Thường Dùng Của EditText
Ngoài các thuộc tính hữu dụng kế thừa từ TextView và View gốc, thì EditText còn có các thuộc tính đặc thù sau.
– android:inputType – Chỉ định loại dữ liệu nào mà người dùng được phép nhập vào EditText, như password, phone, email,… Nhờ đó mà hệ thống sẽ hiển thị bàn phím ảo tương ứng, vừa giúp ứng dụng của bạn trông chuyên nghiệp hơn, giảm thiểu lỗi xảy ra do người dùng nhập không đúng loại dữ liệu ứng dụng cần, mà còn giúp người dùng thao tác thuận tiện hơn nữa. Chúng ta sẽ tìm hiểu một vài inputType ở ví dụ bên dưới.
– android:hint – Hơi giống với android:text nhưng hint đảm nhận vai trò là một gợi ý chìm vào nền của EditText, giúp người dùng hiểu rõ mình cần nhập gì vào đây. Bạn để ý sẽ thấy rằng có nhiều ứng dụng ngoài thị trường không cần đến TextView để làm label cho EditText, mà họ dùng hint để thay cho label này. Và hiển nhiên khi người dùng nhập text nào đó vào EditText, thì hint sẽ biến mất để thay vào đó là text mà họ vừa nhập, hint chỉ hiện ra lại khi người dùng xóa hết text trên EditText này mà thôi. Chúng ta cũng sẽ tìm hiểu hint ở ví dụ bên dưới.
Ví Dụ Dùng EditText Để Nhập Số Điện Thoại
Ví dụ sau đây mình dùng EditText với inputType là kiểu phone, và do đó bàn phím ảo show ra cũng phù hợp cho nhập liệu số điện thoại, người dùng sẽ không thể nhập bất kỳ text vào từ bàn phím này ngoài các số và ký tự liên quan đến số điện thoại.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/edittext" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/edittext_phone_hint" android:inputType="phone" /> </RelativeLayout>
Bạn chú ý hint ở code XML trên đây trỏ đến string có nội dung như hình thứ nhất phía dưới, khi người dùng touch vào EditText, bàn phím cho phone xuất hiện, và khi người dùng gõ vào một text, hint sẽ mất đi (hình thứ hai).
Ví Dụ Dùng EditText Để Nhập Email
Tương tự ví dụ trên, ví dụ này mình chỉnh sửa một chút với inputType là textEmailAddress, bạn sẽ thấy kết quả như hình dưới.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/edittext" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/edittext_email_hint" android:inputType="textEmailAddress" /> </RelativeLayout>
CheckBox – Chỉ Là Một Cái Box Để Check
Cái tiêu đề mình đưa ra như giỡn chơi ha, nhưng thực ra thì… đúng CheckBox là một cái box để check thật. CheckBox chỉ có hai trạng thái là check và uncheck. Trong CheckBox có một cái box (hình vuông) và một TextView để làm nhãn cho CheckBox đó.
Vì CheckBox sẽ được chỉnh sửa nhiều về logic của nó ở Java code, nên khác với các widget trên đây, widget này liệt kê cho bạn thêm các hàm Java.
Các Hàm Java Thường Dùng Của CheckBox
– isChecked() – Cho biết CheckBox có đang check hay không.
– setChecked() – Thiết lập cho CheckBox trạng thái check hay uncheck.
– toggle() – Giả thao tác click vào CheckBox của người dùng, khi gọi hàm này, trạng thái của CheckBox sẽ thay đổi y như người dùng vừa click vào CheckBox vậy.
Các Thuộc Tính XML Thường Dùng Của CheckBox
Hầu hết những thuộc tính cần dùng đến ở XML của CheckBox đều là dành cho label của nó, chính vì vậy bạn chỉ cần vận dụng các thuộc tính từ TextView là đủ rồi.
Tuy nhiên có một thộc tính đặc thù của CheckBox ở XML mà bạn có thể nhớ.
– android:checked – Dùng để thiết lập giá trị mặc định ban đầu cho CheckBox là check hay uncheck.
Đón Nhận Sự Kiện Check
Mặc dù CheckBox cũng giống các view khác, đều có thể nhận sự kiện click thông qua onClick trong XML hay OnClickListener ở Java code. Nhưng bạn đừng nên dùng sự kiện này cho CheckBox, chúng chỉ thông báo cho ứng dụng rằng CheckBox vừa được click mà không mang đến giá trị của CheckBox khi đó đang là check hay uncheck. Vì vậy tốt nhất là bạn nên dùng sự kiện OnCheckedChangeListener chuyên dụng cho CheckBox như ví dụ sau, khi đó sẽ có biến boolean truyền vào hàm onCheckChange() cho biết trạng thái của CheckBox khi vừa mới click.
Ví Dụ CheckBox
Ví dụ này mình hiển thị CheckBox với thuộc tính checked được thiết lập ban đầu là true, điều này có nghĩa là khi ứng dụng được run lên thì CheckBox này đã được check sẵn.
XML code.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:id="@+id/checkBox" android:layout_width="match_parent" android:layout_height="wrap_content" android:checked="true" android:text="@string/checkbox_demo" /> </RelativeLayout>
Java code bắt sự kiện OnCheckedChangeListener như mình có nêu.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox); checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { if (isChecked) { Toast.makeText(MainActivity.this, "Thanks, you checked!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Please keep the box is checked!", Toast.LENGTH_SHORT).show(); } } }); }
Kết quả run ứng dụng.
ToggleButton – Nếu Bạn Muốn CheckBox Mà Không Thích CheckBox?
ToggleButton | Android Developers
Chà phức tạp nhỉ, dành cho bạn nào muốn giao diện trông mới mẻ hơn. So sánh về tính năng thì ToggleButton cũng giống như CheckBox, đều biểu diễn hai trạng thái check và uncheck (trong trường hợp của ToggleButton thì hai trạng thái này được gọi là on và off). Nhưng so sánh về giao diện thì lại khác, ToggleButton trông như một công tắc ngoài đời thực, với đèn led kèm theo, đèn sáng báo hiệu on (check) và đèn tắt là off (uncheck).
Các Thuộc Tính Thường Dùng Của ToggleButton
Các hàm Java hay các thuộc tính XML đều giống với CheckBox ở trên. Tuy nhiên do ToggleButton không hiển thị label “tĩnh” như CheckBox, mà hiển thị thay phiên nhau cho hai trạng thái on/off, nên thuộc tính set label của nó cũng có khác đôi chút như sau.
– android:textOn – Hiển thị label cho ToggleButton khi trạng thái là check.
– android:textOff – Hiển thị label cho ToggleButton khi trạng thái là uncheck.
Ví Dụ ToggleButton
XML code như sau.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <ToggleButton android:id="@+id/toggleButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:textOff="@string/toggle_demo_off" android:textOn="@string/toggle_demo_on" /> </RelativeLayout>
Java code như sau.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton); toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { if (isChecked) { Toast.makeText(MainActivity.this, "Checked!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Unchecked!", Toast.LENGTH_SHORT).show(); } } }); }
Kết quả như sau.
Switch – Công Tắc Mới Hơn ToggleButton
Có một dạng công tắc nữa, tính năng giống với ToggleButton, nhưng đẹp hơn, đó là Switch. Tuy nhiên Switch sử dụng kiểu hiển thị label dạng “tĩnh” giống CheckBox chứ không phân biệt text on/off như ToggleButton. À còn một điều quan trọng nữa, đó là Switch được hỗ trợ từ API level 14, tức là nếu ứng dụng của bạn có hỗ trợ Android level thấp hơn 14 thì hoặc đừng nên xài Switch, hoặc xài thư viện gì đó có thể giả Switch cho Android thấp hơn 14 đó.
Ví Dụ Switch
XML code.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <Switch android:id="@+id/switchDemo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="@string/app_name" /> </RelativeLayout>
Java code.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Switch switchDemo = (Switch) findViewById(R.id.switchDemo); switchDemo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { if (isChecked) { Toast.makeText(MainActivity.this, "Checked!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Unchecked!", Toast.LENGTH_SHORT).show(); } } }); }
Kết quả run ứng dụng.
RadioButton – Chỉ Được Chọn Một Mà Thôi
RadioButton | Android Developers
Lại một dạng check/uncheck nữa. Nhưng mà RadioButton hoàn toàn khác với họ hàng của CheckBox vừa nhắc đến. Trong khi họ hàng của CheckBox chỉ biết đến cá nhân mỗi người mà thôi, tức là người dùng muốn check/uncheck gì lên từng item thì item đó sẽ thay đổi trạng thái, không cần biết đến họ hàng xung quanh có bị thay đổi gì hay không, nếu giao diện của bạn có 10 CheckBox, thì người dùng có thể check cả 10 CheckBox này, hoặc uncheck cả 10.
Với RadioButton, bạn phải gom chúng lại thành một nhóm, và mỗi thành viên RadioButton trong nhóm này sẽ “nhìn nhau mà sống”. Cụ thể hơn, chỉ có duy nhất một thành viên trong nhóm này có trạng thái là check, nếu người dùng click vào một thành viên, anh chàng đó là check, các thành viên còn lại sẽ tự động chuyển về uncheck.
RadioGroup
Như nói ở trên, RadioButton thường được gom lại thành nhóm (group) để chúng có thể đảm bảo chỉ một thành viên trong nhóm được check, để gom nhóm thì chúng ta dùng đến RadioGroup (RadioGroup | Android Developers). Về cơ bản thì RadioGroup chính là con của LinearLayout, ngoài các thuộc tính kế thừa từ LinearLayout mà bạn đã biết, thì RadioGroup còn có các hàm Java thường dùng chuyên biệt như sau.
– check() – Hàm này sẽ chỉ định RadioButton nào trong nhóm được check, các RadioButton còn lại sẽ là uncheck, tham số truyền vào là một ID của RadioButton trong nhóm, ví dụ R.id.radio1.
– clearCheck() – Hàm này uncheck hết tất cả các thành viên bên trong nhóm.
– getCheckedRadioButtonId() – Hàm này trả về ID của RadioButton trong nhóm đang được check.
Ví Dụ RadioButton
Ở XML code, mình gom ba RadioButton vào trong một RadioGroup như sau.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <RadioGroup android:id="@+id/radioGroup" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RadioButton android:id="@+id/radio1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radio_1"/> <RadioButton android:id="@+id/radio2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radio_2"/> <RadioButton android:id="@+id/radio3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radio_3"/> </RadioGroup> </RelativeLayout>
Trong Java code, đầu tiên sau khi lấy RadioGroup ra từ XML, mình set RadioButton thứ hai làm default được check thông qua ID của nó được truyền vào hàm check(). Rồi set sự kiện OnCheckChangedListener cho RadioGroup này để biết được ID của RadioButton nào sẽ được check.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radioGroup); // Set auto check for the second radio button radioGroup.check(R.id.radio2); radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int id) { if (id == R.id.radio1) { Toast.makeText(MainActivity.this, "The first one checked", Toast.LENGTH_SHORT).show(); } else if (id == R.id.radio2) { Toast.makeText(MainActivity.this, "The second one checked", Toast.LENGTH_SHORT).show(); } else if (id == R.id.radio3) { Toast.makeText(MainActivity.this, "The third one checked", Toast.LENGTH_SHORT).show(); } } }); }
Kết quả vừa mới run ứng dụng (hình bên trái), và sau khi check vào RadioButton thứ nhất (hình bên phải).
Trên đây là các widget thông dụng nhất mà các ứng dụng Android hay dùng. Tất nhiên sẽ còn nhiều widgets khác nhưng sẽ không phổ biến bằng những thứ mình vừa nêu trên đây. Nếu bạn thấy còn có widget nào thiếu mà theo lẽ mình cũng nên liệt kê ra, thì hãy để lại comment bên dưới.
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é.
Reblogged this on gioilaptrinh.
Em viết hàm này toàn bị lỗi:
public void showMessage(View view) {
}
Mong anh chỉ bảo!
Bạn Nam gửi project qua mail yellowcode.books@gmail.com, hoặc share qua Google Drive hay bằng gì cũng được, để mình xem lỗi chỗ nào. Hàm bạn gửi vậy thấy ổn, có lẽ lỗi chỗ nào đó khác, nhìn vào project của bạn mới biết được nhé 🙂
Sáng nay dậy sớm thử mò mò nên cuối cùng em cũng khắc phục được rồi ạ. Cám ơn Ad
Haha chúc mừng bạn.
Bài viết của ad quá tuyệt, cuốn hút và dễ hiểu
Mình có 1 app khi chạy nó sẽ báo áp suất 4 lốp xe. Giờ mình muốn sử dụng kết quả đó để đưa vào widget để widget sẽ tự động update 30 phút 1 lần. Mong ad chỉ bảo giúp với ạ.
Với mong muốn này của bạn thì bạn nên tìm hiểu thông tin về App Widget https://developer.android.com/guide/topics/appwidgets.
Mình biết khi bạn hỏi câu hỏi này thì bạn đã biết về App Widget rồi, chắc có lẽ bạn muốn biết nhiều thông tin hơn về cách xây dựng chức năng này. Tuy nhiên, hiện mình chưa viết về App Widget này nhưng có thể trong tương lai sẽ nói đến, nên bạn chịu khó tự đọc bài viết từ trang Android Developer hoặc các bài hướng dẫn khá cnhe1.