[Android căn bản] Bài 4:Bắt sự kiện trong Android.

[Android căn bản] Bài 4:Bắt sự kiện trong Android.

Xin chào các bạn chúng ta lại gặp nhau trong Series Android căn bản truyền kì. Ở bài trước mình đã giới thiệu với các bạn về các loại layout của android và các sắp xếp các view vào các layout của Android và các layout này có thể kết hợp với nhau để tạo nên giao diện cho ứng dụng của bạn. Hôm nay tôi sẽ giới thiệu với các bạn cách để bắt sự kiện của các view, control trong Android.

Giới thiệu.

Trong chúng ta ai cũng dùng điện thoại để lướt Facebook, chơi game, nghe nhạc và sử dụng các ứng dụng đúng không nào và bạn có thấy là khi bạn nhấn vào một nút nào đó thì sẽ có một công việc nào đó được thực hiện đúng không như bạn đăng nhập vào ứng dụng Facebook thì khi bạn nhấn đăng nhập thì ứng dụng bắt đầu đăng nhập vào tài khoản của bạn đúng không nào, vậy làm thế nào để làm được việc đó trong Android.

Ví dụ tôi có 1 ứng dụng đơn giản màn hình bao gồm một Button và một Textview khi tôi nhấn cái Button thì sẽ hiển thị câu xin chào mọi người lên Textview.

Ví dụ sự kiện trong Android

Ví dụ sự kiện trong Android

Giao điện khá đơn giản phải không nào, đây là code giao diện:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_press"
        android:layout_width="147dp"
        android:layout_height="49dp"
        android:text="Press"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@+id/tv_hello"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginRight="8dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintVertical_bias="0.264" />

    <TextView
        android:id="@+id/tv_hello"
        android:layout_width="380dp"
        android:layout_height="42dp"
        android:text="TextView"
        android:textAlignment="center"
        android:textSize="20pt"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="-70dp"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginRight="8dp"
        app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>

Như tôi đã nói ở bài trước đây mới chỉ là cái giao diện mặt ngoài của ứng dụng mà thôi khi bạn nhấn vào cái nút press kia thì cũng chả có chuyện gì xảy ra đâu, vì thế chúng ta cần lập trình cho phần hồn của cái Activity này. Trong Android có rất nhiều cách để gán sự kiện cho view nhưng tôi xin giới thiệu hai cách hay được sử dụng nhất còn mấy cách kia nếu bạn có hứng thú vui lòng tự tìm trên Internet.

Tôi xin giới thiệu cách ánh xạ các View trong Android và hai cách gán sự kiện thường được sử dụng là: Anonymous Event và Variables Event Listerner.

Ánh xạ các view của Android.

Trong Android muốn sử dụng được các View trên file XML đã thiết kế thì chúng ta phải ánh xạ chúng trong file Java của Android, trong ví dụ trên tôi có Button Press có id là btn_pressTextview có id là tv_hello giờ tôi sẽ ánh xạ nó như sau:

package com.tuandc.project1.project1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView tv_Hello;
    Button btn_press;// Khởi tạo hai biến TextView và Button để chuẩn bị ánh xạ các control

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_Hello = (TextView) findViewById(R.id.tv_hello); // sử dụng findViewById để tìm và ánh xạ control tù File Xml vào biến tv_Hello
        btn_press = (Button) findViewById(R.id.btn_press);
    }
}

Và như bạn thấy tôi sử dụng hai biến có kiểu là TextView và Button để ánh xạ các control trên file XML vào hai biến này trong câu lệnh findViewById bạn thấy có tham số truyền vào là R.id.tv_hello đây chính là id của TextView trên file XML và khi bạn đặt một id cho một view/control nào trong file XML thì nó sẽ được Android lưu vô hệ thống.

OK vậy là xong phần ánh xạ giờ là gán sự kiện.

Anonymous Event

Anonymous Event nếu dịch ra tiếng việt thì là sự kiện nặc danh và đúng như tên gọi của nó với cách gán sự kiện này ta sẽ không gán trực tiếp vào control/view trong file XML thông qua thuộc tính onClick mà ta sẽ gán sự kiện trong file Java lúc các control/view đã được ánh xạ.

Cách gán như sau.

package com.tuandc.project1.project1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView tv_Hello;
    Button btn_press;// Khởi tạo hai biến TextView và Button để chuẩn bị ánh xạ các control

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_Hello = (TextView) findViewById(R.id.tv_hello); // sử dụng findViewById để tìm và ánh xạ control tù File Xml vào biến tv_Hello
        btn_press = (Button) findViewById(R.id.btn_press);
        // Gán sự kiện click cho Button
        btn_press.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tv_Hello.setText("Xin chào mọi người");// Gán chuôi Xin chào mọi người cho TextView
            }
        });
    }
}

Như bạn thấy có một phương thức setOnClickListener được gọi tại btn_press và khi ta new Phương thước View.OnClickListener() thì nó sẽ Override lại phương thức onClick và ta sẽ viết code xử lí trong phương thức này.

Và trên đây là cách gán sự kiện Anonymous Event. sau đây tôi xin giới thiệu với các bạn cách gán sự kiện Variables Event Listerner

Variables Event Listerner.

Cách gán thứ hai là Variables Event Listerner, cách này ta sẽ dung một biến trung gian để lưu sự kiện của control và cách này ta có thể viết xử lý sự kiện một cách tập trong nhất..

Code:

package com.tuandc.project1.project1;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView tv_Hello;
    Button btn_press;// Khởi tạo hai biến TextView và Button để chuẩn bị ánh xạ các control
    View.OnClickListener ClickEvent = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_Hello = (TextView) findViewById(R.id.tv_hello); // sử dụng findViewById để tìm và ánh xạ control tù File Xml vào biến tv_Hello
        btn_press = (Button) findViewById(R.id.btn_press);
        // Khởi tao gia trị cho biến ClickEvent
        ClickEvent = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.btn_press:
                        tv_Hello.setText("Xin chào mọi người");
                        break;
                }
            }
        };

        btn_press.setOnClickListener(ClickEvent);// Gán biến sự kiện cho control
    }
}
Như bạn thấy tham số truyền vào phương thức setOnClickListener() là biến ClickEvent mà ta đẫ tạo ở trên

Và đây là kết quả khi chạy của hai cách gán sự kiện trên.

Kết quả chạy ví dụ

Kết quả chạy ví dụ

Vật là tôi đã giới thiệu với các bạn cách ánh xạ các control cũng như cách gán sự kiện cho các control này trong Android xin cảm ơn các bạn đã theo dõi hẹn gặp lại các bạn sau.

Góc xả stress: bạn thấy đấy lập trình rất kì diệu và đau não đúng không nào vậy để xả stress tôi có 1 câu hỏi sau :v

Nếu như có một em robot như thế này:

Bạn thấy em này thế nào

Bạn sẽ lập trình em này như thế nào.

vậy bạn sẽ lập trình và gán hành động gì cho em này ?.