Showing posts with label Android. Show all posts
Showing posts with label Android. Show all posts

Sunday, April 5, 2015

MAKING NICE LOOKING BAR CHARTS IN ANDROID

We wanted to make a simple but nice looking bar chart for one of our apps, but we couldn't find a graph library that looked the way we wanted it to and that supported older versions of Android. So instead we created our own custom Bar Chart view, that we can use in our XML layouts just like the standard Android views.

Below I set out how you can produce a simple bar chart which takes user input from within the app, performs a calculation and presents the results in a Custom View:


If you have any questions about this, you can contact us on support@stonekick.com.

CREATE CUSTOM VIEW CLASS

First we need to create our view class - this needs to extend the standard Android View class:
public class BarChart extends View {
    public BarChart(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialise();
    }
}

CREATE PAINT OBJECTS

We're going to use the Paint class to control the appearance of what we draw - the colours, text size & line width. We create a few of these in our initialise method - one for each drawing style that we will need.
void initialise() {
    textPaint = new Paint();
    linePaint = new Paint();
    boxPaint1 = new Paint();
    linePaint.setStrokeWidth(1);
    linePaint.setColor(0xFFC5C5C5);
    textPaint.setColor(0xFFC5C5C5);
    textPaint.setTextSize(14*scaleFactor);
    boxPaint1.setColor(0xFFFFBB33);
}

SCALE FACTOR

You will notice in the code above that the text size is multiplied by a scale factor. This is to take account of different display densities. All of our drawing is done in pixels, but the different screens on Android devices have different numbers of pixels per inch (ppi). So if we set our text to be 14 pixels high, it will be drawn a different size on different devices. We don't want that, so we increase the text size in proportion to the device's ppi. You can use the Android display metrics class to work out the scale factor:
DisplayMetrics metrics = getResources().getDisplayMetrics();
scaleFactor = metrics.density;

OVERRIDE DRAW METHOD

Every time Android wants to draw your custom view, it will call the onDraw method, so we need to override that:
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
}
Android passes in a Canvas object when it calls onDraw. This has various methods that you can use to create your graphics, for example:
To draw a line segment with the specified start and stop x,y coordinates:
canvas.drawLine(float startX, float startY, float stopX , float stopY, Paint paint);

To draw a rectangle using a specified paint:
canvas.drawRect(float left, float top, float right , float bottom, Paint paint);

To draw text, with origin t (xy), using the specified paint:
canvas.drawText(String text, float x, float y, Paint paint);
Again, remember that by default all of the drawing is done in pixels, so your co-ordinate system is in pixels starting from the top left hand corner of the canvas.
The easiest way to position the objects within your canvas is to use the getWidth and getHeight methods to determine the width and height of your canvas. You can then use multiples of this to position each object.
In the below example we used the width and height values along with the scale factor previously calculated to draw the line underneath the bar chart. This has the same amount of padding to the left and right of the line, with a larger amount below the line to allow for the text labelling each bar:
int fullWidth = getWidth();
int fullHeight = getHeight();
int padding = (int) (10*scaleFactor);
canvas.drawLine(padding, fullHeight-2.5*padding, fullWidth-padding , fullHeight-2.5*padding,
linePaint);
The other elements within our bar chart view were then positioned in a similar manner, using multiples of the width, height, and padding.
                               Android Bar Chart Positioning

VARYING THE HEIGHT OF THE BARS

It is likely that you will want the height of the bars within the chart to vary depending on user input to the app. We've included a couple of methods to set the heights of the bars in our custom view - you can tailor this to meet your needs. The important part here is we need to call invalidate() after changing the heights of the bars - this tells Android that it needs to redraw the view.
// Earnings and cost are calculated values based on user inputs.
// The Main app Activity calculates these and calls the below methods
// when the user inputs a new value

public void setCost (double value) {
    cost = value;
    invalidate();
}
public void setEarnings (double value) {
    earnings = value;
    invalidate();
}
The user inputs can then be used to proportion the height of one bar against the other:
int fullWidth = getWidth();
int fullHeight = getHeight();
int maxBarHeight = fullHeight-80;
float bar1height;
float bar2height;
int padding = (int) (10*scaleFactor);
float middle = (float) (fullWidth*0.5);
float quarter = (float) (fullWidth*0.25);
float threequarter = (float) (fullWidth*0.75);


if(earnings>cost) {
bar2height = (float) maxBarHeight;
    bar1height = (float) (cost/earnings*maxBarHeight);
}else{
    bar1height = (float) maxBarHeight;
    bar2height = (float) (earnings/cost*maxBarHeight);
}

int bar1bottom = fullHeight-padding*3;
float bar1top = bar1bottom-bar1height;
canvas.drawRect(padding*2, bar1top, middle-padding , bar1bottom, boxPaint1);

int bar2bottom = fullHeight-padding*3;
float bar2top = bar2bottom-bar2height;
canvas.drawRect(middle+padding, bar2top, fullWidth-padding*2, bar2bottom, boxPaint2);

BRINGING CUSTOM VIEW INTO LAYOUT FILE

Once you have created your BarChart custom view class you can then start to use it within your layout files:
<com.stonekick.pvassistant.BarChart
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:id="@+id/bcResults"
    android:background="#ffffff">

FULL CODE

That's it. If you put all of the pieces together you end up with this:
package com.stonekick.pvassistant;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;



public class BarChart extends View {
    Paint textPaint;
    Paint linePaint;
    Paint boxPaint1;
    Paint boxPaint2;
    Paint textPaint1;
    Paint textPaint2;
    double cost;
    double earnings;
    float scaleFactor;

    public BarChart(Context context) {
        super(context);
        initialise();
    }
    public BarChart(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialise();
    }
    public BarChart(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initialise();
    }
    void initialise() {

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        scaleFactor = metrics.density;

        textPaint = new Paint();
        linePaint = new Paint();
        boxPaint1 = new Paint();
        boxPaint2 = new Paint();
        textPaint1 = new Paint();
        textPaint2 = new Paint();
        linePaint.setStrokeWidth(1);
        linePaint.setColor(0xFFC5C5C5);
        textPaint.setColor(0xFFC5C5C5);
        textPaint.setTextSize(14*scaleFactor);
        boxPaint1.setColor(0xFFFFBB33);
        boxPaint2.setColor(0xFF218b21);
        textPaint1.setColor(0xFFFFBB33);
        textPaint2.setColor(0xFF218b21);
        textPaint1.setTextSize(14*scaleFactor);
        textPaint2.setTextSize(14*scaleFactor);

    }

    // Earnings and cost are calculated values based on user inputs.
    // The Main app Activity calculates these and calls the below methods
    // when the user inputs a new value

    public void setCost (double value) {
        cost = value;
        invalidate();
    }

    public void setEarnings (double value) {
        earnings = value;
        invalidate();
    }

    protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            int fullWidth = getWidth();
            int fullHeight = getHeight();
            int padding = (int) (10*scaleFactor);
            int maxBarHeight = fullHeight-5*padding;
            float bar1height;
            float bar2height;

            if(earnings>cost) {
                bar2height = (float) maxBarHeight;
                bar1height = (float) (cost/earnings*maxBarHeight);
            }else{
                bar1height = (float) maxBarHeight;
                bar2height = (float) (earnings/cost*maxBarHeight);
            }

            canvas.drawLine(padding, fullHeight-25*scaleFactor, fullWidth-padding , fullHeight-25*scaleFactor, linePaint);

            float middle = (float) (fullWidth*0.5);
            float quarter = (float) (fullWidth*0.25);
            float threequarter = (float) (fullWidth*0.75);

            int bar1bottom = fullHeight-padding*3;
            float bar1top = bar1bottom-bar1height;
            float val1pos = bar1top-padding;
            canvas.drawRect(padding*2, bar1top, middle-padding , bar1bottom, boxPaint1);
            canvas.drawText("Cost", quarter-padding, fullHeight-padding, textPaint1);
            canvas.drawText("$" + cost/1000 + "K", quarter-padding, val1pos, textPaint);

            int bar2bottom = fullHeight-padding*3;
            float bar2top = bar2bottom-bar2height;
            float val2pos = bar2top-padding;
            canvas.drawRect(middle+padding, bar2top, fullWidth-padding*2, bar2bottom, boxPaint2);
            canvas.drawText("Earnings", threequarter-padding*3, fullHeight-padding, textPaint2);
            canvas.drawText("$" + earnings/1000 + "K", threequarter-padding*2, val2pos, textPaint);
        }

}
Nguồn : http://www.stonekick.com/techblog/creating_nice_looking_bar_charts.html

Wednesday, October 15, 2014

NỘI DUNG KHÓA HỌC:





Lession 1:

Tổng quan về SmartPhone:Thiết lập môi trường viết ứng dụng Android trên Eclipse

Các thao tác trên Eclipse

Cài đặt SDK và các API hỗ trợ lập trình

Cài đặt máy ảo (Emulator) để test ứng dụng Android

Cấu trúc ứng dụng và Manifest file

Xây dựng và thực thi ứng dụng “Hello World”

Cài đặt ứng dụng lên thiết bị thực bằng file apk

Đưa ứng dụng lên Android Market,

Lession 2:

Tạo các ứng dụng cơ bản:TextView, EditText, Button

CheckBox

RadioGroup, RadioButton

Dialog (Alert Dialog, Progress Dialog, Custom Dialog …)

Xây dựng ứng dụng “Calculator”


Lession 3:

Sử dụng các tài nguyên trong AndroidValues

Drawable

Menu (Context Menu, Option Menu)

Layout

Linear Layout

Absolute Layout

Relative Layout

Table Layout

Lession 4:

Xử lý sự kiệnCảm ứng màn hình, xây dựng ứng dụng duyệt ảnh

Activity, Intent

Xây dựng ứng dụng gọi điện thọai


Lession 5:

Chuyên đề NFC:Công nghệ RFID

Các API giao tiếp thẻ Mifare

Giới thiệu hệ thống giữ xe bằng thẻ RFID

Lession 6:

Chuyên đề NFC :Xây dựng ứng dụng đọc – ghi thông tin cá nhân lên thẻ Mifare

Mô hình thẻ thanh tóan trả trước, trừ tiền dần.


Lession 7:

Chuyên đề Titanium:Giới thiệu nền tảng Titanium để xây dựng nhanh ứng dụng Android

Cài đặt môi trường Titanium

Xây dựng các ứng dụng “Simple Demo”

Lession 8:

Chuyên đề Titanium:Cảm ứng màn hình, xây dựng ứng dụng duyệt ảnh với Titanium

Activity, Intent

Xây dựng ứng dụng gọi điện thọai với Titanium


Lession 9:

Chuyên đề cơ sở dữ liệu:Giới thiệu hệ quản trị cơ sở dữ liệu SQLite

Xây dựng lớp “DatabaseHelper” để lưu trữ và truy vấn cơ sở dữ liệu.

Viết ứng dụng học trắc nghiệm giao thông

Lession 10:

Chuyên đề webserviceGiới thiệu webservice và thư viện KSOAP2

Xây dựng webservice “programmer calculator”

Xây dựng ứng dụng máy tính khoa học online thông qua webservice

LẬP TRÌNH JAVA CƠ BẢN


Chi tiết chương trình học (72 giờ):
MODULE 1: LẬP TRÌNH ANDROID CƠ BẢN
a) Mục tiêu:
- Tiếp cận môi trường lập trình di động.
- Có kiến thức cơ bản về nền tảng Android.
- Thành tạo kỹ năng lập trình, phát triển ứng dụng mobile trên Android
b) Nội dung:
- Bài 1: Giới thiệu về Android và lịch sử phát triển
- Bài 2: Toàn cảnh hệ điều hành Android
- Bài 3: Cài đặt SDK
- Bài 4: Môi trường phát triển phần mềm Android
- Bài 5: Ứng dụng Hello world
- Bài 6: Chỉnh sửa lại Project đầu tiên của bạn
- Bài 7: Sử dụng XML - Dựa trên bố cục
- Bài 8: Sử dụng các Widget cơ bản
- Bài 9: Làm việc với các Container
- Bài 10: Các phương thức nhập dữ liệu trong Android
- Bài 11: Sử dụng Selection Widgets
- Bài 12: Làm quen với List
- Bài 13: Tiếp tục về Widgets và Containers
- Bài 14: Nhúng bộ WebKit vào trình duyệt
- Bài 15: Sử dụng các Menu
- Bài 16: Hiển thị các Pop-up message
- Bài 17: Xử lý các sự kiện liên quan đến vòng đời của Activity
- Bài 18: Xử lý việc xoay màn hình
Thời gian: 36 giờ 
a) Mục tiêu:
- Có kiến thức nâng cao hơn về nền tảng Android.
- Được rèn luyện phát triển các ứng dụng tiên tiến như: ứng dụng mạng, ứng dụng xử lý ảnh và video, ứng dụng bản đồ, xử lý đa tiến trình…
- Thao tác với các loại dữ liệu như XML, JSON …
- Thao tác CSDL cục bộ SQLite, SharedPreference...
- Tương tác với mạng xã hội như : Facebook, Twitter …
- Làm việc với cloud computing : Google drive, Dropbox …
- Tự phát triển được các ứng dụng Android của riêng mình.
- Hiểu và biết cách áp dụng quy trình phát triển một ứng dụng hoàn chỉnh từ đầu cho đến cuối thông qua những giờ làm bài tập lớn và đồ án tốt nghiệp.
b) Nội dung:
- Bài 19: Làm việc với các Luồng
- Bài 20: Tạo các bộ lọc Intent
- Bài 21: Khởi chạy Activity và các Acivity con
- Bài 22: Làm việc với các tài nguyên
- Bài 23: Định nghĩa và sử dụng styles
- Bài 24: Xử lý nhiều kích thước màn hình
- Bài 25: Truy cập Files
- Bài 26: Sử dụng Preferences-(Tùy chọn)
- Bài 27: Quản lý và truy cập cơ sở dữ liệu.
- Bài 28: Giao tiếp thông qua Internet.
- Bài 29: Làm việc với Service
- Bài 30: Các mô hình Service cơ bản
- Bài 31: Cảnh báo người dùng thông qua các Notification
- Bài 32: Yêu cầu và đòi hỏi permission
- Bài 33: Truy cập các dịch vụ GPS
- Bài 34: Xử lý các cuộc gọi điện thoại
- Bài 35: Các bộ font chữ
- Bài 36: Công cụ phát triển nâng cao  
Thời gian: 36 giờ
Ưu điểm của khóa học lập trình android:
·        Sau khi hoàn thành xong chương trình thì học viên sẽ được:
-         Hiểu và đăng ký các tài khoản để xây dựng các ứng dụng cho Android
-         Các qui trình triển khai ứng dụng cho người dùng trên Google Play Store
-         Tùy chỉnh các điều khiển trên giao diện ứng dụng
-         Xây dựng các ứng dụng đa chạm (Gesture Recognization)
-         Thao tác với các loại dữ liệu như XML, JSON
-         Thao tác CSDL cục bộ SQLite, SharedPreference...
-         Tương tác với Webservice
-         Tương tác với Google Cloud
-         Xây dựng ứng dụng liên quan đến bản đồ (GPS, Internet Connection – Wifi, 3G)
-         Viết ứng dụng đa nhiệm (AsynTask, Thread, Handler)
-         Viết ứng dụng đa phương tiện (Camera, Media, Gallery)
-         Gửi thông báo trên thiết bị, thông báo từ máy chủ server
-         Cách thức sử dụng các thư viện mở trên Internet 
-         Viết ứng dụng tích hợp điện thoại, dịch vụ tin nhắn
-         Tìm hiểu các bộ cảm biến trên Android
   Nếu BẠN thực sự muốn trở thành những chuyên gia LẬP TRÌNH ANDROID, hãy đừng bỏ lỡ CƠ HỘI tuyệt vời này.

Nội dung chi tiết


Lập trình Java cho Android
-          Giới thiệu về ngôn ngữ lập trình Java
-          Làm việc với Eclipse
-          Làm việc với biến và kiểu dữ liệu
-          Các câu lệnh điều khiển, lặp
-          Kiểm tra dữ liệu đầu vào
-          Debug một chương trình Java
-          Làm việc với lập trình hướng đối tượng
-          Định nghĩa các lớp, đối tượng
-          Làm việc với thừa kế và interface
-          Làm việc với Package và Enumerations
-          Làm việc với Arrays
-          Collectons và Generics
-          Làm việc với kiểu dữ liệu Dates và Strings
-          Kiêm soát Exceptions
-          Làm việc với Multi Threading
Lập trình Android
-          Giới thiệu về Android
-          Sử dụng Eclipse để phát triển ứng dụng Android
-          Phát triển và Test ứng dụng Android
-          Làm việc với layouts and widgets
-          Làm việc với Event Handle
-          Làm việc với themes and styles
-          Làm việc với Menus và Preferences
-          Làm việc với Fragments
-          Làm việc với threads, files, adapters, and intents
-          Làm việc với services and notifications
-          Làm việc với work with SQLite databases
-          Làm việc với tabs và custom adapters
-          Làm việc với content providers
-          Triển khai một ứng dụng
-          Làm việc với Maps và Locations
-          Sử dụng Webservice vào ứng dụng
-          Lập trình đồ họa – Hoạt hình
-          Lập trình MultiMedia
-          Lập trình tương tác đa chạm
-          Giới thiệu về lập trình Game
-          Xây dựng và đưa ứng dụng lên Store
Thực hiện dự án với Java
-          Thực hiện dự án sát với thực tế các công ty phần mềm đang làm
-          Được giáo viên hướng dẫn thực hiện
-          Làm việc theo mô hình sản xuất phần mềm hiện đại (Scrum)
-          Sử dụng các công cụ quản lý như Redmine, BitButket
Kỹ năng mềm:
-          Hướng dẫn nghiên cứu , tiếp cận các công ty phần mềm
-          Hướng dẫn viết CV, đơn xin việc
-          Kỹ năng phỏng vấn tìm việc
-          Hỗ trợ tìm việc cho đến khi tìm được việc làm
-          Tư vấn kỹ năng phát triển nghề nghiệp
-          Đạo đức nghề nghiệp
-          Làm việc với chuyên gia

Tuesday, September 30, 2014

Tìm hiểu về listview trong Android (Bài 13)

Listview là dùng để hiện thị các danh sách , được truyền vào từ các đối tượng được gọi ra bởi các lớp trong Android. Mà danh sách này hiện thị các thông tin vì thế chúng ta sài controlListview.
Bài này tôi chỉ cung cấp các cách xử lý listview trong android thông qua các ví dụ đơn giản nhé.
Để sử dụng tốt listview bạn phải bấp vào 5 Trường hợp sau.
 Sử dụng Listview control với mảng dữ liệu
              + Sau đây tôi sẽ đưa cho bạn một ví dụ đơn giản để bạn  hiểu về công dụng của listview
              + Có 2 control đó là một listview và một textview để hiện thông tin khi mình rở chuột đến listview hoặc click.
Tập  xml trong Android mình sẽ coppy code để bạn tham khảo nhen.
Code của XML.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/intro"
    tools:context="com.example.listviewdanhsach.MainActivity" >

    <TextView
        android:id="@+id/tvdanhsach"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:textColor="#ffffff"
        android:textSize="18dp"
        android:textStyle="bold" />

    <ListView
        android:id="@+id/lvdanhsach"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:layout_alignParentLeft="true" >

    </ListView>

</RelativeLayout>
Tâp tin java.
mình sẽ giới thiệu cho các bạn cách thức lấy dữ liệu listview trong android để đưa lên màn hình chính.
   Các bước thực hiên đưa các giá trị trong mảng vào một listview
1 Khỏi tạo dữ liệu cho mang nhé
cú pháp như sau :
String arr[]={"Tran tien anh","tran thi thu huyen","tran huu duan"};
2. Truyền địa chỉ listview vào id listview
Cú Pháp:
ListView lvdanhsach=(ListView)findViewById(R.id.lvdanhsach);
3 Đưa datasouce vào Adapter (đưa mảng listview vào Adapter)
Cú Pháp:
ArrayAdapter <String> adapter=new ArrayAdapter<String>(this,Android.R.layout.simple_list_item1,arr);
4 Đưa data souce vào listview
lv.setAdapter(adapter)
5. Thiết lập sự kiện cho ListView
Trước tiên chung ta khai bao một textview để khi chúng ta kích chuột vào từng vị trị trên listview chúng ta có thể truyền tham số vị trị và tên cho listview đó lên textview
Cú Pháp:
Text/view tvhienthi=(TextView)findViewById(T.id.tvhienthi);
Xong chúng ta thiết lập sự kiện listview nhé.
lvdanhsach.setOnItemClickListener(new AdapterView.onitemclickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
tvdanhsach.setText("chao ban" +position +" Họ Tên :" +arr[position]);
// trong đó position là ví trị cuart từng listview.
}
});
Giờ đây bạn có thể thực hành nào.. hãy tạo một sanh dách hiện thị ra trên listview vào khi bạn click vào từng vị trị trên listview thì sẽ hiện trên và vị trị trên textview.
Bạn có thể tải code tại đây nhé.

Wednesday, September 24, 2014

Bài tập 9: Thực hành về Toast Notification và Alert Dialog

Vì trong tất cả các ứng dụng Tôi thấy rằng chúng ta hay sử dụng Toast và Alert Dialog để kiểm tra một điều gì đó, hay đơn giản chỉ là xuất thông báo. Vì vậy bài tập này Tôi sẽ hướng dẫn các bạn làm quen với Toast & Alert Dialog, sau đó các bạn sẽ được thực hành với các control cơ bản và nâng cao.
- Cả Toast và Alert Dialog khi hiển thị lên thì các tiến trình (hay các lệnh) khác  vẫn cứ tiếp tục làm việc.
1) Toast:
- Toast có thể được tạo và hiển thị trong Activity hoặc trong Servive.
- Không cho phép người sử dụng tương tác
- Khi hiển thị sau khoảng thời gian nào đó sẽ tự đóng lại
- Có 2 giá trị mặc định (ta nên sử dụng 2 giá trị này, không nên gõ con số cụ thể vào): hằng số Toast.LENGTH_SHORT hiển thị trong  2 giây, Toast.LENGTH_LONG hiển thị trong 3.5giây.
Cách tạo Toast:
Toast toast=Toast.makeText(YourActivity.this, “Hiển thị gì thì ghi ở đây”,  Toast.LENGTH_SHORT);
toast.show();
- Khi nào bạn nên sử dụng Toast?
Theo Tôi thì tùy bạn, bạn có thể sử dụng trong trường hợp hiển thông báo trong các mục thiết lập thông số cấu hình, hay đơn giản chỉ là hiển thị lên để xem thông tin tạm thời nào đó (giống như để kiểm tra một vấn đề sảy ra chẳng hạn).
- Hình dưới đây cho bạn biết 1 Toast đang hiển thị:
2) Alert Dialog:
- Hiển thị và cho phép người dùng tương tác, ví dụ bạn nhìn hình Tôi chụp bên dưới, khi nhấn nút “Cancel”, chương trình sẽ hiển thị Alert Dialog hỏi xem có chắc chắn muốn xóa hay không? Bấm No thì không, bấm Yes thì tắt chương trình.
9_dialog_1- Cách tạo Alert Dialog:
AlertDialog.Builder b=new AlertDialog.Builder(YourActivity.this);
 
b.setTitle(“Question”);
b.setMessage(“Are you sure you want to exit?”);
b.setPositiveButton(“Yes”, new DialogInterface. OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
finish();
}});
b.setNegativeButton(“No”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
}
});
b.create().show();
Ý nghĩa của các hàm :
- setTitle : thiết lập tiêu đề cho Dialog
- setMessage: Thiết lập nội dung cho Dialog
-setIcon : để thiết lập Icon
-setPositiveButton, setNegativeButton thiết lập hiển thị Nút chọn cho Dialog (ở đây bạn không quan tâm Nút chấp nhận hay Nút hủy nó thuộc PositiveButton hay NegativeButton vì đó là tùy thuộc bạn chọn. Chú ý là ở đối số thứ 2 của các hàm này sẽ là DialogInterface. OnClickListener chứ không phải View. OnClickListener
- create() để tạo Dialog
- show() để hiển thị Dialog.

Bài tập 8: Các kiểu lập trình sự kiện trong Android

Bài tập này Tôi sẽ trình bày 6 kiểu lập trình sự kiện trong Android. Tôi sẽ sử dụng một số Control căn bản để Demo, đặc biệt là Button dùng để tạo sự kiện.
  1. Onclick in XML
  2. Inline anonymous listener
  3. Activity is listener
  4. Listener in variable
  5. Explicit listener class
  6. View Subclassing
- Tôi sẽ lần lượt đưa ra 6 ví dụ khác nhau cho 6 kiểu lập trình sự kiện ở trên, các bạn hãy cố gắng theo dõi, nó rất quan trọng để làm các bài tập tiếp theo.
1. Onclick in XML:
- Ví dụ 1: Đơn giản chỉ là cộng 2 số, bạn thiết kế giao diện như bên dưới:
8_event_0- Khi nhấn vào nút “Tổng 2 số”, chương trình sẽ xuất kết quả như hình bên trên : 80+33= 113
- Bạn xem Layout Outline để dễ thiết kế (chú ý là bạn có thể bỏ LinearLayout1 đi):
8_event_1
- Chú ý là ta sử dụng Onclick in XML:
8_event_2- Trong đoạn lệnh ở trên thì ta sử dụng android:conClick=”btn_tong2so”, tức là ta đã gán một sự kiện click cho Button này, sự kiện này tên là btn_tong2so. Ta cần khai báo một hàmbtn_tong2so ở trong Activity class như hình bên dưới:
8_event_3- Khi chạy ứng dụng bạn sẽ được kết quả như bên dưới:
2. Inline anonymous listener
- Ví dụ viết chương trình chuyển đổi năm dương lịch qua năm âm lịch như hình bên dưới:
8_event_5- Khi người sử dụng nhập vào EditText giá trị là 1 năm Dương Lịch bất kỳ nào đó rồi nhấn nút “Chuyển đổi”, chương trình sẽ chuyển năm dương lịch thành năm âm lịch. Trong ví dụ trên nếu người sử dụng nhập 2013 thì sẽ ra năm âm lịch là “Quý Tỵ”.
- Chú ý là ta tạo một anonymous listener, trước tiên bạn hãy xem Outline XML để cho dễ bề thiết kế:
8_event_6- Để chuyển từ năm dương lịch sang năm âm lịch bạn cần biết một số thông tin sau:
8_event_7
- Bây giờ ta tiến hành gán sự kiện cho nút “Chuyển đổi” (ở đây id Tôi để là button1), mở Activity class lên vào sửa lệnh như bên dưới:
8_event_8-  Bạn tự đưa lệnh vào Bước 1, Bước 2, bước 3 ở trên. Cách lấy dữ liệu nhập vào từ EditText đã hướng dẫn ở phần Onclick in XML, làm theo cái này để lấy được giá trị là năm dương lịch ra, sau đó lấy năm này xử lý theo bảng Can và Chi như hướng dẫn thì Ta sẽ ra được năm Âm lịch tương ứng.
3. Activity is listener:
- Trong cách viết sự kiện này thì Activity sẽ implements interface có kiểu sự kiện (rất nhiều loại interface). Ở đây Tôi chỉ ví dụ trường hợp cho Button các trường hợp khác các bạn tự tìm hiểu và suy luận ra.
- Tôi sẽ có một bài ví dụ nhỏ sau: Hãy xây dựng ứng dụng tính Chỉ số khối cơ thể -chữ viết tắt BMI (Body Mass Index )- được dùng để đánh giá mức độ gầy hay béo của một người. Chỉ số này có thể giúp xác định một người bị bệnh béo phì hay bị bệnh suy dinh dưỡng.
+Cách tính như sau:
Gọi W là khối lượng của một người (tính bằng kg) và H là chiều cao của người đó (tính bằng m), chỉ số khối cơ thể được tính theo công thức:
8_event_9Phân loại để đánh giá như sau:
  • BMI < 18: người gầy
  • BMI = 18 – 24,9: người bình thường
  • BMI = 25 – 29,9: người béo phì độ I
  • BMI = 30 – 34,9: người béo phì độ II
  • BMI > 35: người béo phì độ III
Tôi sẽ thiết kế giao diện như hình bên dưới và cung cấp Outline, các bạn hãy thiết kế lại để nâng cao kinh nghiệm:
8_event_10-Bạn thấy đó: Thông số bên trên chính là của chính Tôi, Tên Tôi là Thanh, chiều cao 1.68 mét, cân nặng 58 kg. Khi Tôi chọn “Tính BMI” thì chương trình sẽ tính ra được BMI của Tôi là 20.5 và chẩn đoán là “Bình thường”, tức là Tôi có sức khỏe tốt, dáng người chuẩn (có thể là niềm ước ao của một số các bạn trong lớp).
- Để các bạn đỡ căng thẳng thì Tôi xin nói lý do vì sao Tôi lại viết phần mềm này làm ví dụ minh họa. Bởi vì bạn gái của Tôi luôn luôn chê Tôi gầy (hay gọi là Xí Quách gì đó). Tôi đã chứng mình là Tôi có dáng người chuẩn không cần chỉnh bằng cách viết phần mềm này (công thức theo chuẩn Quốc Tế nên nó là một bằng chứng không thể chối cãi). Tôi nghĩ các bạn cũng có thể dùng nó để chứng minh rằng mình không bị Béo Phì Cấp độ 3.
- Quay trở lại ví dụ ,Bạn xem Outline của giao diện này dưới đây (Tôi cố tình không cung cấp source XML nhằm mục đích kích thích các bạn tự tìm tòi):
8_event_11
- Đây là nội dung Coding trong Activity:
import java.text.DecimalFormat;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity
implements OnClickListener{
Button btnChandoan;
EditText editTen,editChieucao,
editCannang,editBMI,editChandoan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnChandoan=(Button) findViewById(R.id.btntinhBMI);
btnChandoan.setOnClickListener(this);
editTen=(EditText) findViewById(R.id.editten);
editChieucao=(EditText) findViewById(R.id.editchieucao);
editCannang=(EditText) findViewById(R.id.editcannang);
editBMI=(EditText) findViewById(R.id.editBMI);
editChandoan=(EditText) findViewById(R.id.editChanDoan);
}
@Override
public void onClick(View arg0) {
double H=Double.parseDouble(editChieucao.getText()+””);
double W=Double.parseDouble(editCannang.getText()+””);
double BMI=W/Math.pow(H, 2);
String chandoan=””;
if(BMI<18)
{
chandoan=”Bạn gầy”;
}
else if(BMI<=24.9)
{
chandoan=”Bạn bình thường”;
}
else if(BMI<=29.9)
{
chandoan=”Bạn béo phì độ 1″;
}
else if(BMI<=34.9)
{
chandoan=”Bạn béo phì độ 2″;
}
else
{
chandoan=”Bạn béo phì độ 3″;
}
DecimalFormat dcf=new DecimalFormat(“#.0″);
editBMI.setText(dcf.format(BMI));
editChandoan.setText(chandoan);
}
}
- a) Bạn quan sát Activity này sẽ implements interface OnClickListener
- b) Bản thân interface OnClickListener có mộ Abstract Method là onClick(View arg0) nên ta phải Override nó.
- c) Để Button có thể hiểu được sự kiện thì Ta phải gọi dòng lệnh: btnChandoan.setOnClickListener(this); bản thân Activity là một sự kiện nên ta dùng thisđể truyền vào hàm.
- d) Bạn quan sát thêm Tôi có sử dụng : DecimalFormat dcf=new DecimalFormat(“#.0“); Mục đích là Tôi định dạng 1 số lẻ thập phân, bạn muốn 2 số lẻ thập phần thì ghi “#.00″ hay muốn 3 thì “#.000″ …vân vân.
Bạn có thể load đầy đủ coding mẫu ở đây: http://www.mediafire.com/?71khpisxa3wmvq5
4) Listener in variable:
- Tương tự như Activity Is listener, nhưng  khác ở chỗ thay vì implement interface cho Activity thì nó lại được lưu trữ vào một biến có kiểu Listener trong activity. Làm cách này thì ta có thể chia sẻ chung một biến sự kiện cho các control khác nhau.
- Ví dụ bạn xem hình bên dưới:
8_event_12- Bạn thấy đó, ở trên khai báo 1 biến có kiểu listener là interface OnClickListener.
- Và biến này sẽ được chia sẻ cho 2 Button Login và Cancel.
- Bây giờ Tôi sẽ cung cấp ví dụ Chuyển đổi độ F qua C và ngược lại. Bạn xem giao diện bên dưới:
8_event_13- Giao diện bên trên sẽ có 3 button. Ta sẽ tạo một biến sự kiện và chia sẻ cho 3 Button ở trên.
- Bạn xem Outline để thiết kế:
8_event_14- Đây là công thức chuyển đổi:
8_event_15-Bạn xem coding Activity:
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private Button btnFar,btnCel,btnClear;
private EditText txtFar,txtCel;
private OnClickListener myVarListener=new OnClickListener() {
@Override
public void onClick(View arg0) {
//Lấy F và C từ control ở đây
if(arg0==btnFar)
{
//Bạn xử lý chuyển đổi F–>C theo công thức
}
else if(arg0==btnCel)
{
//Bạn xử lý chuyển đổi C–>F theo công thức
}
else if(arg0==btnClear)
{
txtFar.setText(“”);
txtCel.setText(“”);
txtFar.requestFocus();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnFar = (Button)findViewById(R.id.btnFar);
btnCel = (Button)findViewById(R.id.btnCel);
btnClear = (Button)findViewById(R.id.btnClear);
txtFar = (EditText)findViewById(R.id.txtFar);
txtCel = (EditText)findViewById(R.id.txtCel);
btnFar.setOnClickListener(myVarListener);
btnCel.setOnClickListener(myVarListener);
btnClear.setOnClickListener(myVarListener);
}
}
Bạn tự viết lệnh cho 2 nút chuyển đổi : cách lấy dữ liệu đã hướng dẫn ở những kiểu lập trình sự kiện trước, bắt buộc bạn phải lấy được. Sau khi lấy được thì chỉ cần ráp vào công thức là xong.
5) Explicit listener class:
- Trường hợp này ta tách riêng một class đóng vai trò là class sự kiện riêng.
- Khi nào lượng coding trong ứng dụng khổng lồ và phức tạp thì ta nên tách class sự kiện riêng để dễ quản lý.
Tôi ví dụ giải phương trình bậc 2, bạn xem giao diện bên dưới:
8_event_16- Khi chọn “Tiếp tục”, chương trình sẽ xóa trắng toàn bộ dữ liệu trên màn hình đồng thời focus tới ô Nhập a.
- Khi chọn “Giải PT”, chương trình sẽ tiến hành lấy thông số a,b,c và tiến hành giải phương trình bậc 2 và cho ra kết quả như hình trên.
- Khi chọn “Thoát”, chương trình sẽ được đóng lại.
- Bạn xem Outline dưới đây:
8_event_17- Tiến hành coding, bạn mở Activity class và coding như bên dưới:
import java.text.DecimalFormat;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
Button btnTieptuc,btnGiai,btnThoat;
EditText edita,editb,editc;
TextView txtkq;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnTieptuc=(Button) findViewById(R.id.btntieptuc);
btnGiai=(Button) findViewById(R.id.btngiaipt);
btnThoat=(Button) findViewById(R.id.btnthoat);
btnTieptuc.setOnClickListener(new MyEvent());
btnGiai.setOnClickListener(new MyEvent());
btnThoat.setOnClickListener(new MyEvent());
edita=(EditText) findViewById(R.id.edita);
editb=(EditText) findViewById(R.id.editb);
editc=(EditText) findViewById(R.id.editc);
txtkq=(TextView) findViewById(R.id.txtkq);
}
public void giaiPtb2()
{
String sa=edita.getText()+””;
String sb=editb.getText()+””;
String sc=editc.getText()+””;
int a=Integer.parseInt(sa);
int b=Integer.parseInt(sb);
int c=Integer.parseInt(sc);
String kq=””;
DecimalFormat dcf=new DecimalFormat(“#.00″);
if(a==0)
{
if(b==0)
{
if(c==0)
kq=”PT vô số nghiệm”;
else
kq=”PT vô nghiệm”;
}
else
{
kq=”Pt có 1 No, x=”+dcf.format(-c/b);
}
}
else
{
double delta=b*b-4*a*c;
if(delta<0)
{
kq=”PT vô nghiệm”;
}
else if(delta==0)
{
kq=”Pt có No kép x1=x2=”+dcf.format(-b/(2*a));
}
else
{
kq=”Pt có 2 No: x1=”+dcf.format((-b-Math.sqrt(delta))/(2*a))+
“; x2=”+dcf.format((-b-Math.sqrt(delta))/(2*a));
}
}
txtkq.setText(kq);
}
private class MyEvent implements OnClickListener
{
@Override
public void onClick(View arg0) {
if(arg0==btnTieptuc)
{
edita.setText(“”);
editb.setText(“”);
editc.setText(“”);
edita.requestFocus();
}
else if(arg0.getId()==R.id.btngiaipt)
{
giaiPtb2();
}
else if(arg0.getId()==R.id.btnthoat)
{
finish();
}
}
}
}
- Bạn quan sát coding ở bên trên. Tôi tạo một lớp sự kiện tên là MyEvent, control nào muốn được gán sự kiện chỉ cần gọi lệnh giống như Tôi gán cho Button Giải phương trình:
btnGiai.setOnClickListener(new MyEvent());
- Trong hàm public void onClick(View arg0) . Bạn để ý là lúc thì Tôi so sánh theo Object, lúc thì Tôi lại lấy Id ra để so sánh. Đây là cố ý của Tôi, Tôi muốn nói rằng các bạn có thể kiểm tra xem Button nào sẽ được chọn trên giao diện bằng cách so sánh đối tượng hoặc lấy Id ra để so sánh (tùy ý đồ lập trình của mỗi người)
- Ở đây Tôi có 1 lời khuyên cho các bạn là khi phải xử lý quá nhiều dòng lệnh (lệnh phức tạp) thì bạn nên viết thành từng hàm riêng, và trong hàm xử lý sự kiện  bạn chỉ cần gọi tên hàm mà thôi. Cụ thể là đối với Button “Giải PT” thì Tôi lại viết và gọi riêng hàm giaiPtb2(), còn đối với Button Tiếp tục và Thoát thì Tôi lại không cần thiết viết hàm vì xử lý quá đơn giản.
6. View Subclassing
- Kỹ thuật này không được phổ biến cho lắm. Bạn chỉ sài khi thêm Control động (lúc runtime) vào màn hình. Ta có thể dùng bất kỳ kỹ thuật nào (6 cách Tôi vừa nêu) để thêm sự kiện động cho một Button động.
-Ở cách cuối cùng này thì bạn phải override phương trình performClick của chính Button control:
8_event_18- Như vậy các bạn đã được thực hành về các kiểu lập trình sự kiện trong Android, biết được cách lấy dữ liệu từ EditText, biết xử lý định dạng dữ liệu, củng cổ thêm được Layout.
- Trong các bài tập sắp tới các bạn sẽ được thực hành về Toast & Alert Dialog, và rất nhiều  các control cơ bản cũng như nâng cao trong Android .
- Bạn phải hiểu rõ các kỹ thuật lập trình này để tùy vào từng trường hợp cụ thể mà bạn nên quyết định kỹ thuật nào cho phù hợp.