[Tự học lập trình Android] Bài 7: Các kiểu lập trình sự kiện trong Android

Các kiểu lập trình sự kiện trong Android

Một số kiểu lập trình sự kiện phổ biến trong Android:
Onclick in XML
Inline anonymous listener
Activity is listener
Listener in variable
Explicit listener class
View Subclassing


Tìm hiểu các sự kiện qua các ví dụ mẫu

1. Onclick in XML

Ví dụ 1: Xây dựng ứng dụng tính tổng 2 số a và b, với giao diện như sau:
Hình 1

Khi nhấn vào nút “Tổng 2 số”, sẽ in ra tổng 2 số vừa nhập.

- Bạn xem Layout Outline để dễ thiết kế (chú ý là bạn có thể bỏ LinearLayout1 đi):

Hình 2

Chú ý: là ta sử dụng Onclick in XML:
Hình 3
- 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àm btn_tong2so ở trong Activity class như hình bên dưới:
Hình 4

- Khi chạy ứng dụng bạn sẽ được kết quả như bên dưới:

Hình 5

2. Inline anonymous listener

Ví dụ 2: Xây dựng ứng dụng chuyển đổi năm dương lịch qua năm âm lịch như hình bên dưới:
Hình 6

- 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ế:

Hình 7

- Để 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:
Hình 8

- 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:
Hình 9

- 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
Ví dụ: Hãy xây dựng ứng dụng tính Chỉ số khối cơ thể - BMI (Body Mass Index ), BMI đượ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.

- 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). Trong ví dụ này ta xét trường hợp cho Button còn các trường hợp khác các bạn tự tìm hiểu và suy luận ra.

+ 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:
Hình 10

Phâ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

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:
Hình 11

- Ví dụ thông số: chiều cao 1.68 mét, cân nặng 58 kg. Click “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”.

- Xem Outline của giao diện này dưới đây (các bạn có thể tìm hiểu thêm):
Hình 12

- 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);
 }
}


- Ta thấy class Activity đã implements interface OnClickListener
- Bản thân interface OnClickListener có mộ Abstract Method là onClick (View arg0) nên ta phải Override nó.
- Để 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.
- Sử dụng: DecimalFormat dcf=new DecimalFormat(“#.0“); // Mục đích là đị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″ …

4) Listener in variable
Ví dụ: Xây dựng ứng dụng (hình dưới):
Hình 13

- 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.
- Ở 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.
- Ví dụ Chuyển đổi độ F qua C và ngược lại. Bạn xem giao diện bên dưới:
Hình 14

- 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ế:

Hình 15

- Đây là công thức chuyển đổi:

Hình 16
- 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:
 
Hình 17

- 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:
Hình 18
- 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ạ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ư gán cho Button Giải phương trình:

btnGiai.setOnClickListener(new MyEvent());

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:
Hình 19
- 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.

Tham khảo: duythanhcse

-----------------------------------------

Quảng cáo

Загрузка...

Categories

8051 (1) AI (1) AI programming (1) amazon (1) Android (27) ASP (1) Assembly (17) Bài giảng (2) Bài giảng lập trình C và Cpp (16) bài giảng quản lý dự án CNTT (1) bài tập java (1) bài tập lập trình (1) Bài viết hay (62) Bản đồ tư duy (1) Bidvertiser (1) Biểu diễn thuật toán (1) bitcoin (1) blockchain (1) Blockchain là gì (1) Bubble-Sort (1) C (77) C Plus Plus (103) C sharp (11) C++ (3) cấu trúc dữ liệu giải thuật (1) Cây (tree) (2) Cây quyết định (3) CDSL phân tán (1) Chữa bài tập Java (1) code assembly (1) Công nghệ điện toán đám mây (1) Công nghệ lập trình (1) Cơ sở dữ liệu (10) CSS (2) Cuộc cách mạng công nghiệp 4.0 (1) Danh ngôn lập trình (1) Danh sách liên kết (list) (1) Datamining (4) Đại số gia tử và ứng dụng (1) đăng ký Amazon (1) Đăng ký hosting (2) đặt hàng trên Amazon (1) Đệ quy (2) Đồ họa (4) Độ phức tạp của thuật toán (1) ebook-csdl (1) ebook-giaithuat (1) ebook-laptrinh (1) ebook-phancung-mang (1) ebook-tinhocungdung (1) ebook-web (1) Exceptions (1) Genetic Algorithm (1) Giải hệ phương trình tuyến tính (5) giải thuật (3) giải thuật Đệ quy (1) Giáo trình (2) Góc học tập (34) Góc suy ngẫm (1) Google App Engine (2) Heap-Sort (1) Hệ quản trị CSDL (1) Học lập trình (125) Học lập trình C và CPP qua ví dụ (15) học lập trình Java (7) HostGator (1) hợp ngữ (1) HPH (25) HTML (1) Hướng Dẫn Đăng Ký Tên Miền và Host Trên Hostgator (1) hướng dẫn mua host (1) hướng dẫn nhận tiền (1) hướng dẫn payoneer (1) Hướng dẫn sử dụng Emu8086 (1) hướng dẫn viết báo (1) hướng đăng ký tên miền (1) Insert-sort (2) iOS (1) Java (50) Java Căn bản (5) java core (3) Java GUI (1) JavaScript (3) Kiếm tiền online (10) Kỹ thuật đồ họa máy tính (9) Kỹ thuật lập trình (16) kỹ thuật SEO (1) Lập trình 8051 với C/C++ (1) Lập trình căn bản (7) Lập trình Cơ sở dữ liệu (2) Lập trình điều khiển thiết bị (1) Lập trình hợp ngữ (1) Lập trình hướng đối tượng (38) Lập trình hướng đối tượng với Java (6) Lập trình mạng (6) Lập trình mobile (3) Lập trình nhúng (1) Lập trình trí tuệ nhân tạo (1) lập trình vi xử lý (1) lập trình viên (1) Lập trình viên độc lập (1) Luyện thi IC3 (4) Lý thuyết Cơ sở dữ liệu (2) Lý thuyết đồ thị (11) Mạng máy tính (1) Mẹo tìm kiếm trên Google (1) Merge-Sort (1) MS Access (1) Mua hàng trên Amazon (1) Nghiên cứu khoa học (1) ngon-ngu-khac (1) Ngôn ngữ lập trình (1) Nhúng code Assembly trong C\C++ (2) Những lỗi thường gặp khi lập trình (1) Oracle (1) Pascal (3) payoneer (1) people-group (1) phần cứng máy tính (1) PHP (1) Quản lý dự án CNTT (1) Queue (hàng đợi) (1) Quick-Sort (1) Seclection-sort (2) SEO (1) SQL (5) Stack (ngăn xếp) (1) Swift (8) tài liệu CNTT miễn phí (2) Tài liệu tham khảo (2) thanh toán quốc tế (1) Thiết kế Web (2) Thủ thuật máy tính (5) thuattoan-khac (1) Thuật toán (41) Thuật toán di truyền (2) Thuật toán Đệ quy (4) Thuật toán K-Mean (1) Thuật toán khác (9) Thuật toán leo đồi (1) Thuật toán ma trận (7) Thuật toán Sắp Xếp -Sort (9) Thuật toán Tìm kiếm - Search (5) Thương mại điện tử (4) Tiện ích máy tính (3) Tìm hiểu Blockchain (1) Tìm kiếm nhị phân (2) Tìm kiếm tuần tự (Line search) (2) Tin học văn phòng (5) Tin tức công nghệ (7) Tính định thức của ma trận (1) Toán rời rạc (12) Trí tuệ nhân tạo (8) Tự học lập trình Android (14) Tự học lập trình C và CPP (14) tự học lập trình iOS (8) Tự học lập trình java qua các ví dụ (7) Ứng dụng cơ sở dữ liệu (1) VB (2) vẽ ngôi nhà (1) ví dụ Assembly (1) xcode (8) XML (1) Xử lý ma trận (mảng 2 chiều) (7) Xử lý mảng 1 chiều (1) Xử lý ngoại lệ (1)