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:
Ở đây chúng ta khai báo RelativeLayout
với các thuộc tính width, height
và id.
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.
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.