Android – Tạo Activity


Được đăng vào ngày 09/05/2016 | 0 bình luận
Đánh giá bài viết

Trong phần trước chúng ta đã tạo một Activity, trong phần này chúng ta sẽ tiếp tục đoạn code ở phần trước và tạo một Activity mới khi click vào nút Send. 

Activity là một thành phần xử lý các hành động, thường thì Activity sẽ làm các công việc khởi tạo giao diện và xử lý sự kiện trên giao diện đó, thông thường chúng ta sẽ thiết kế từng giao diện ứng với từng Activity nên một Activity cũng hay được gọi là một màn hình (screen).

Xử lý sự kiện nút Send

Chúng ta sửa lại file layout chính ở bài trước.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="horizontal" >
    <EditText android:id="@+id/edit_message" 
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:hint="@string/edit_message"/>
    <Button android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="@string/button_send" 
        android:onClick="sendMessage"/>
</LinearLayout>

Chúng ta khai báo thêm thuộc tính android:onClick cho thẻ Button, sendMessage là tên phương thức xử lý khi người dùng click vào nút Button.

Trong file MainActivity.java chúng ta sửa lại như sau:

package com.phocode.myfirstapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

    public final static String EXTRA_MESSAGE = "com.phocode.myfirstapp.MESSAGE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void sendMessage(View view)
    {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText editText = (EditText)findViewById(R.id.edit_message);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivity(intent);
    }
}

Chúng ta khai báo phương thức sendMessage tương ứng với giá trị của thuộc tính android:onClick trong file XML.

public final static String EXTRA_MESSAGE = "com.phocode.myfirstapp.MESSAGE";

Chúng ta khai báo một hằng số có tên là EXTRA_MESSAGE để dùng cho việc gửi dữ liệu đi tới Activity khác (sẽ trình bày ở dưới). Ở đây giá trị của hằng số này chúng ta dùng chính tên package cho khỏi trùng lắp và dễ nhớ, tất nhiên bạn có thể dùng giá trị khác.

public void sendMessage(View view)
{
    ...
}

Phương thức sendMessage nhận vào một đối tượng View, đây chính là đối tượng Button được click, tức là khi chúng ta chạy ứng dụng và click vào nút “Send” thì ứng dụng sẽ gọi phương thức sendMessage và gửi vào đó biến tham chiếu đến đối tượng Button này.

Lưu ý là các phương thức xử lý sự kiện như phương thức sendMessage trên phải được khai báo public, có kiểu trả về là void và tham số duy nhất là một đối tượng View.

Intent intent = new Intent(this, DisplayMessageActivity.class);

Intent là một đối tượng tạo cầu nối giữa các thành phần khác nhau trong khi ứng dụng đang chạy, nói chung là bạn chỉ cần hiểu Intent giống như một máy nhắn tin giúp trao đổi thông tin giữa các thành phần khác nhau vậy, Intent có rất nhiều công dụng nhưng thường thì người ta dùng Intent để chạy một Activity mới.

Tham số của phương thức khởi tạo Intent là một đối tượng lớp Context, ở đây chúng ta truyền this là vì lớp Activity kế thừa từ lớp Context, tham số thứ 2 là tên lớp Activity mà nó sẽ truyền tới, ở đây là lớp DisplayMessageActivity, chúng ta sẽ định nghĩa lớp này sau.

EditText editText = (EditText)findViewById(R.id.edit_message);
String message = editText.getText().toString();

Tiếp theo chúng ta lấy đối tượng EditText đã khai báo trong file main.xml bằng phương thức findViewById(), ở đây chúng ta truyền vào tên thuộc tính id đã khai báo, rồi ép kiểu về lớp EditText bởi vì phương thức này trả về một đối tượng lớp View. Sau đó chúng ta lấy đoạn chuỗi được gõ trong EditText này bằng phương thức getText(), phương thức này trả về một đối tượng Editable nên chúng ta dùng phương thức toString() để lấy giá trị ra kiểu String.

intent.putExtra(EXTRA_MESSAGE, message);

Đối tượng Intent có thể mang theo dữ liệu khi gọi một Activity mới, để truyền dữ liệu đi thì chúng ta dùng phương thức putExtra(), phương thức này nhận vào dữ liệu dạng từ điển, tức là một cặp khóa-giá tr, ở đây chúng ta dùng khóa là hằng số EXTRA_MESSAGE mà chúng ta đã khai báo ở đầu lớp, giá trị là dữ liệu trong biến message.

startActivity(intent);

Cuối cùng để chạy một Activity thì chúng ta gọi phương thức startActivity() và truyền vào một đối tượng Intent.

Tạo Activity mới

Như đã trình bày ở đầu bài, một Activity thông thường sẽ làm công việc thiết kế giao diện của một màn hình và xử lý các thao tác xảy ra trên màn hình đó. Trong một ứng dụng Android thì để thiết kế giao diện của một Activity chúng ta có 2 cách là code “chay” bằng Java bên trong file .java, 2 là thiết kế riêng trong một file XML. Ở đây chúng ta sẽ thiết kế trong file XML.

Chúng ta tạo một file XML có tên là activity_display_message.xml bên trong thư mục res/layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/content" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent">
</RelativeLayout>

Ở đây chúng ta khai báo RelativeLayout với các thuộc tính width, heightid. Chi tiết về các layout sẽ được trình bày ở bài khác.

Tiếp theo chúng ta định nghĩa lớp Activity mới.

package com.phocode.myfirstapp;

import android.content.Intent;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class DisplayMessageActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);

        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        textView.setText(message);

        RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
        layout.addView(textView);
    }
}

Lớp DisplayMessageActivity sẽ kế thừa từ lớp Activity.

setContentView(R.layout.activity_display_message);

Khi biên dịch, các file layout sẽ được gộp lại thành một file có tên là R.java trong thư mục gen/, file này sẽ lưu các ID cho từng layout. Nhờ đó chúng ta có thể tham chiếu đến các layout ngay bên trong code Java.

Intent intent = getIntent();

Bất cứ Activity nào cũng được gọi từ một đối tượng Intent, chúng ta có thể tham chiếu đến đối tượng này thông qua phương thức getIntent().

String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

Đối tượng Intent của chúng ta có mang theo dữ liệu, chúng ta có thể lấy dữ liệu đó qua phương thức getStringExtra(), phương thức này nhận vào khóa và trả về giá trị tương ứng.

TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);

Chúng ta gán giá trị được gửi tới vào một đối tượng TextView, ở đây chúng ta khai báo trong code Java chứ không khai báo trong file layout. Phương thức setTextSize() quy định kích thước chữ, phương thức setText() sẽ quy định nội dung trong TextView đó.

RelativeLayout layout =(RelativeLayout) findViewById(R.id.content);
layout.addView(textView);

Cuối cùng chúng ta tham chiếu đến đối tượng RelativeLayout thông qua phương thức findViewById() và chèn TextView vào layout này bằng phương thức addView().

Sau khi đã định nghĩa xong lớp Activity thì chúng ta phải khai báo Activity đó trong file AndroidManifest.xml.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.phocode" android:versionCode="1" android:versionName="1.0">
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
    <activity android:name="MainActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="DisplayMessageActivity"></activity>
    </application>
</manifest>

Chúng ta chỉ cần khai báo thêm một thẻ activity với thuộc tính name là tên lớp Activity mà chúng ta sẽ định nghĩa.

Capture

Biên dịch và chạy ứng dụng, bây giờ khi bấm vào nút “Send” thì ứng dụng sẽ mở một màn hình thứ hai có một chuỗi text lấy từ EditText của màn hình trước.

Capture

 







Trả lời


Lưu ý: bọc code trong cặp thẻ [code language="x"][/code] để highlight code.


Ví dụ:


[code language="cpp"]


    std::cout << "Hello world";


[/code]



Các ngôn ngữ được hỗ trợ gồm: actionscript3, bash, clojure, coldfusion, cpp, csharp, css, delphi, diff, erlang, fsharp, go, groovy, html, java, javafx, javascript, latex, matlab, objc, perl, php, powershell, python, r, ruby, scala, sql, text, vb, xml.

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *