Trong phần này chúng ta sẽ tìm hiểu một số lớp View
cơ bản.
Spinner
Spinner
là View
cho phép chúng ta chọn một item trong một danh sách các item.
Ví dụ 1:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Spinner android:id="@+id/spn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:entries="@array/dlangs" android:layout_marginTop="10dip" android:prompt="@string/spn_title" /> <TextView android:id="@+id/tvId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" /> </LinearLayout>
Trong file main.xml,
chúng ta khai báo thẻ Spinner
và thẻ TextView.
Danh sách các item của Spinner
sẽ được khai báo trong file strings.xml.
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Spinner</string> <string name="spn_title">Choose a language</string> <string-array name="dlangs"> <item>Python</item> <item>Java</item> <item>C++</item> <item>Ruby</item> </string-array> </resources>
Trong file strings.xml
chúng ta khai báo tên biến spn_title
dùng làm tiêu đề cho Spinner,
biến dlangs
có kiểu string-array
là danh sách các item cho Spinner.
package com.phocode; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Spinner; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; public class MainActivity extends Activity implements OnItemSelectedListener { private TextView tv; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.tvId); Spinner spn = (Spinner) findViewById(R.id.spn); spn.setOnItemSelectedListener(this); } @Override public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) { String item = parent.getItemAtPosition(pos).toString(); tv.setText(item); } @Override public void onNothingSelected(AdapterView<?> arg0) { tv.setText(""); } }
Item được chọn trong Spinner
sẽ được dùng làm text của TextView.
public class MainActivity extends Activity implements OnItemSelectedListener
Khi có Item nào được chọn thì Spinner
sẽ giải phóng sự kiện, chúng ta implement giao diện OnItemSelectedListerner
để bắt lấy sự kiện đó, có 2 phương thức phải override lại là onItemSelected()
và onNothingSelected().
Spinner spn = (Spinner) findViewById(R.id.spn); spn.setOnItemSelectedListener(this);
Để các phương thức trên có thể bắt sự kiện thì chúng ta dùng phương thức setOnItemSelectedListener()
của Spinner
và truyền vào đối tượng có override các phương thức đó.
@Override public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) { String item = parent.getItemAtPosition(pos).toString(); tv.setText(item); }
Trong phương thức onItemSelected()
chúng ta lấy đối tượng item đang được chọn bằng phương thức onItemAtPosition(),
sau đó chuyển thành String rồi gán làm text cho TextView.
Ví dụ 2
Trong ví dụ này chúng ta sẽ thiết kế lại như ví dụ trên, chỉ khác là các item sẽ được thêm vào trong Spinner
từ file java chứ không nhập cứng từ file resource nữa.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Spinner android:id="@+id/spnId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:prompt="@string/spn_title" /> <TextView android:id="@+id/tvId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" /> </LinearLayout>
Trong file main.xml
chúng ta có 2 View
là Spinner
và TextView. Spinner
ở đây không được thiết lập thuộc tính src
nữa.
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Spinner2</string> <string name="spn_title">Choose a language</string> </resources>
Trong file strings.xml
chúng ta bỏ danh sách item đi, chỉ còn biến lưu tiêu đề của Spinner.
package com.phocode; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Spinner; import android.widget.ArrayAdapter; import android.widget.TextView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; public class MainActivity extends Activity implements OnItemSelectedListener { private TextView tv; private Spinner spn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView)findViewById(R.id.tvId); spn = (Spinner)findViewById(R.id.spn); List<String> lst = new ArrayList<String>(); lst.add("Python"); lst.add("Java"); lst.add("C++"); lst.add("Ruby"); ArrayAdapter<String> da = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, lst); spn.setAdapter(da); spn.setOnItemSelectedListener(this); } @Override public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) { String item = parent.getItemAtPosition(pos).toString(); tv.setText(item); } @Override public void onNothingSelected(AdapterView<?> arg0) { tv.setText(""); } }
Trong file MainActivity.java
chúng ta thiết lập dữ liệu cho Spinner
và override các phương thức lắng nghe sự kiện như ví dụ trên.
List<String> lst = new ArrayList<String>(); lst.add("Python"); lst.add("Java"); lst.add("C++"); lst.add("Ruby");
Đầu tiên chúng ta sử dụng List
để tạo một danh sách các item sẽ được lưu vào Spinner.
ArrayAdapter<String> da = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, lst);
Tiêp theo chúng ta sử dụng một đối tượng ArrayAdapter,
đối tượng này có tác dụng liên kết dữ liệu giữa Spinner
và List<String>,
mỗi khi List
có sự thay đổi, chẳng hạn như thêm hoặc xóa bớt item thì Spinner
cũng sẽ tự động thêm/bớt các item đó.
spn.setAdapter(da);
Có đối tượng ArrayAdapter
rồi thì chúng ta phải thiết lập adapter đó cho Spinner.
SeekBar
SeekBar
hiển thị một thanh trượt và một cái nút trên thanh trượt đó cho phép chúng ta kéo qua kéo lại trong một khoảng giá trị số nào đó, mỗi khi nút trên thanh trượt thay đổi thì SeekBar
sẽ giải phóng sự kiện và chúng ta bắt sự kiện đó bằng cách dùng giao diện OnSeekBarChangeListener.
Ví dụ:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <SeekBar android:id="@+id/sbId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:max="100" android:progress="50" /> <TextView android:id="@+id/tvId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" /> </LinearLayout>
Ở đây chúng ta thiết kế một SeekBar
và một TextView, TextView
được dùng để hiển thị giá trị của SeekBar.
Khoảng giá trị mặc định của SeekBar
là từ 0 đến 100. Trong đó chúng ta có thể thiết lập giá trị max bằng thuộc tính android:max,
tuy nhiên chúng ta không thể thiết lập giá trị min được.
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">SeekBar</string> <string name="textview_value">50</string> </resources>
Trong file strings.xml
chúng ta khai báo biến textview_value
làm giá trị khởi tạo ban đầu cho TextView.
package com.phocode; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; public class MainActivity extends Activity implements OnSeekBarChangeListener { TextView tv; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SeekBar sb = (SeekBar) findViewById(R.id.sbId); sb.setOnSeekBarChangeListener(this); tv = (TextView) findViewById(R.id.tvId); String val = this.getString(R.string.textview_value); tv.setText(val); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { tv.setText(String.valueOf(progress)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }
Đoạn text trong TextView
dùng chung với giá trị của SeekBar.
public class MainActivity extends Activity implements OnSeekBarChangeListener
Lớp MainActivity
implement giao diện OnSeekBarChangeListener
. Giao diện này có 3 phương thức cần phải override là onProgressChanged()
, onStartTrackingTouch()
và onStopTrackingTouch().
Ở đây chúng ta chỉ cần dùng đến phương thức đầu tiên.
SeekBar sb = (SeekBar) findViewById(R.id.sbId); sb.setOnSeekBarChangeListener(this);
Chúng ta lấy đối tượng SeekBar
và gắn listener cho nó là đối tượng Activity
hiện tại vì đối tượng này đã implement giao diện OnSeekBarChangeListener.
tv = (TextView) findViewById(R.id.tvId); String val = this.getString(R.string.textview_value); tv.setText(val);
Sau đó chúng ta lấy giá trị của biến textview_value
rồi dùng làm text của TextView.
@Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { tv.setText(String.valueOf(progress)); }
Khi chúng ta kéo nút trên SeekBar, phương thức onProgressChanged()
sẽ được gọi, giá trị thay đổi được truyền trong tham số progress,
chúng ta dùng tham số này làm text của TextView.