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àm btn_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:

8_event_4

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 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 C từ control ở đây

if(arg0==btnFar)

{

//Bạn xử chuyển đổi F–>C theo công thức

}

else if(arg0==btnCel)

{

//Bạn xử 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.

Chúc các bạn thành công.

47 responses

  1. [...] – Bây giờ Tôi sẽ làm một ví dụ về cách sử dụng 3 control này (bạn có thể xem lại bài tập các kiểu lập trình sự kiện trong Android): [...]

  2. Thầy ơi cho em hỏi, làm thế nào để mình có thể truyền các tham số qua lại giữa các activity vậy?

  3. Trần Duy Thanh | Reply

    Qua phần Intent em sẽ biết được cách truyền các tham số.

  4. thưa thầy sau khi run code BT giải phương trình thì xuất hiện lỗi là : nếu nhập a!=0 thì phương trình giải đúng, nhưng khi nhập a=0 thì không thể giải đc phương trình toàn báo lỗi ! Mong thầy giúp cho ạ !

    1. Em xin phép được tl thưa thầy,
      Bài thầy đưa lên chỉ là ví dụ để mình hiểu việc bắt sự kiện, nên chưa bắt các điều kiện chặt,
      TH này bị lỗi khi chia số “0”, bạn có thể thêm vào các trường hợp suy biến như giải biện luận PTB2 là ổn ngay.
      Thân,

  5. [...] – Bây giờ Tôi sẽ làm một ví dụ về cách sử dụng 3 control này (bạn có thể xem lại bài tập các kiểu lập trình sự kiện trong Android): [...]

  6. Thầy ơi, em làm bài cộng 2 số, ở chổ public btn_tong2so(View v) thì nó báo lỗi(gạch đỏ) dưới chử View, thế phải làm sao thầy

    1. import android.view.View;

  7. Thầy ơi,bài giả PT bậc 2,e design layout ko đc như của thầy,thầy cho e hỏi cách chia tỉ lệ như của thầy với ạ.

    1. import android.view.View;

  8. Thầy ơi. em bị lỗi the application has stopped unexpectedly khi chạy ứng dụng trên máy ảo, em đã tìm trên net nhưng vẫn không thể sửa được lỗi này.

  9. Thầy ơi, khi em chạy ứng dụng thì máy báo The application has stopped unexpectedly
    em không thể sửa được lỗi này, thầy cho em hỏi với.

    1. Em chụp hình cấu trúc Project và file Manifest cho Thầy xem thử.

      1. Phuong Nguyen

        Cảm ơn thầy, em tìm được lỗi rồi ạ.

      2. OK. Ráng học cho tốt vào.

      3. bạn ơi fix lỗi này thế nào vậy?mình cũng bị tương tự mà ko tìm ra cách fix

    2. Cách sửa lỗi như thế nào vậy bạn, mình cũng bị lỗi tương tự.

  10. public btn_tong2so(View v) sao em vẫn bị lỗi chỗ này nhỉ?em import android.view.View; rồi mà vẫn bị lỗi chỗ đó.Thầy giúp em vs ak.

    1. mình cũng bị lỗi tương tự sau đó mình sửa lại là phương thức
      public void btn_tong2so(View v) nằm bên ngoài protected void onCreate(Bundle savedInstanceState). Như hình trên là khai báo bên trong rồi

  11. double H=Double.parseDouble(editChieucao.getText()+””);

    double W=Double.parseDouble(editCannang.getText()+””);

    double BMI=W/Math.pow(H, 2);

    Thầy có thể giải thích em 3 câu lệnh này không ạ, và cái dấu + ở cuối là gì ?
    Em cảm ơn

    1. (editChieucao.getText()+””) = edtichieucao.getText().toString = chuyển giá trị edittext thành chuỗi String

      1. parseDouble là gì bạn, cách viết này mình chưa gặp nên không hiểu lắm!

      2. chuyển kiểu string sang dạng double để tính toán

  12. cám ơn thầy bài viết rất hữu ích

  13. Thầy vừa dạy hay vừa vui tính :)

  14. cảm ơn thầy nhiều!!

  15. thầy ơi sao cái textview của em nó ko dài hết theo chiều dài màn hình vậy thầy. nó cứ bị chừa ra 2 khoảng bên trái với bên phải chứ ko full theo chiều dài giống như thầy đc! đây là file layout của em, thầy chỉ giúp e với, em cám ơn thầy

  16. thầy ơi cho em hỏi chỉ học 1 sự kiện có giải quyết được hầu hết các bài toán ko ạ. Vì em mới học nên chỉ muốn học cái sự kiện đầu tiên. (học cả 6 sợ tẩu hỏa nhập ma mất)
    Em cảm ơn thầy ạ!

  17. Thày giúp e với ạ:
    e làm VD1
    Trong code thì không thấy báo có lỗi gì cả.
    Khi run thì nó xuất hiện lỗi như vậy, e đã cố tìm cách giải quyết rồi, mà k đc.

    Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

    1. Em kiểm tra package phải nhập chữ thường hết, không chứa các chữ số hoàn toàn.

      1. Dạ, được rồi ạ.
        E cảm ơn thày!

  18. Thầy viết thật sự rất rất hay, rất khoa học và dễ hiểu. E đã đọc nhiều tài liệu tiếng việt và tiếng anh nhưng đây là những bài học tổng hợp rất rõ ràng và đầy đủ, bao quát tất cả các vấn đề rất hay. Cảm ơn thầy ạ.

  19. Em chào anh, em đang theo dõi các bài viết của anh, em thấy các bài viết của anh rất dễ hiểu. Anh có thể cho em xin code của bài này được không ạ, em code theo nhưng có 1 lỗi mà em chưa xử lý đc, ko biết có phải tại code không đúng không nữa. Nó báo lỗi thế này ạ :(
    http://i757.photobucket.com/albums/xx213/chien_hut/Untitled_zpsf73bda12.jpg

  20. Anh oi! Em thay bai giai pt bac 2 giai sai roi! Ket qua phai la -1 va -1.50 co neu theo a, b,c anh nhap vao! Mong anh xem lai !

  21. em cảm ơn thầy vì những bài viết thực sự hữu ích.
    Qua đây mong thầy cho e hỏi là: e kết nối android tới php mysql để lấy dữ liệu hiện thị lên android nhưng lại bị lỗi fonts chữ tiếng việt, thầy có thể chi e cách khắc phục được không ạ, trong mysql e dung utf8_general_ci. rất mong thầy giúp. e xin chân thành cảm ơn ạ.

    1. Em debug xem lỗi tiếng việt ở giai đoạn đọc mysql hay giai đoạn đưa lên giao diện.

      1. Thầy ơi. nó bị lỗi tiếng việt ở giai đoạn đọc mysql thầy ạ. mong thầy giúp đỡ (e dùng JSONParser jParser = new JSONParser(); để lấy dữ liệu) xin cảm ơn thầy.

      2. Nếu lỗi từ khâu đọc MYSQL thì em cố gắng kiểm tra bước này, cách đọc Unicode từ MYSQL như thế nào

      3. em cảm ơn thầy, e khắc phục được rồi. chúc thầy luôn thành công.

  22. Thầy ơi cho em hỏi bài tập giải Phương trình viets xong rồi chạy thì nó hiện Unfortunately…. . là gị bì vậy thầy.

  23. Hùng Nguyễn | Reply

    Bài giảng của thầy, rất công phu, chi tiết và thú vị :)

  24. bài viết của thầy rất hay. Giá như thầy có thêm những bài viết về lý thuyết android thì tốt. Em toàn phải lên trang của android developer đọc tiếng anh, câu được câu chăng :(

  25. bạn nào làm được bài chuyển nhiệt độ rồi cho mình xin code được không. Mình làm mãi mà không chạy được hix.

  26. code của mình như vầy nè nhưng mà khi nhập số vào xong rồi bấm button nó thoát luôn à:
    public void onClick(View v) {
    // TODO Auto-generated method stub
    int C = Integer.parseInt(editC.getText()+””);
    int F = Integer.parseInt(editF.getText()+””);
    if( v ==btnF){
    editF.setText((C * 9 + 32)+””);
    }
    else if(v==btnC){
    editC.setText(((F – 32)*5)+””);
    }
    else if(v==btnCl){
    editC.setText(“”);
    editF.setText(“”);
    editF.requestFocus();
    }

  27. trần tuấn | Reply

    thầy ơi em không biết làm sao cho 3 button ở bài giải phương trình bậc 2 đều nhau, em thử mọi cách mà cứ bị tràn ra khỏi màn hình giao diện
    thầy có thể show xml lên cho em xem được không
    thầy giúp em với . em cảm ơn thầy

  28. Em xin phép hỏi thầy và các bạn .
    em hỏi : tại sao khi em kéo thả các EditText trong TextFields nó lại bị đen màn hình ảo .xml đó ạ . Và nó thông báo lỗi là
    ” Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
    Exception details are logged in Window > Show View > Error Log”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 442 other followers

%d bloggers like this: