ContextMenu trong Android
ContextMenu (menu cho ngữ cảnh) ngữ cảnh hiển thị nổi lên trên màn hình nhưng được gắn với một đối tượng View
nào đó chứ không liên quan gì tới Activity,
menu ngữ cảnh sẽ hiện ra khi chúng ta click và giữ tay trên View
đó trong một khoảng thời gian.
Các phương thức thường dùng trong OptionMenu
1. registerForContextMenu(view): Phương thức này được sử dụng để gắn một ContextMenu cho một View
2. onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo): Phương thức này sẽ thực hiện các công việc khởi tạo menu cho đối tượng Activity,
ở đây chúng ta dùng phương thức inflate()
của lớp android.view.MenuInflater
để lấy dữ liệu của menu từ file options_menu.xml
về sử dụng. Phương thức này nhận vào một đối tượng android.view.Menu.
3. onContextItemSelected(MenuItem item): Phương thức onContextItemSelected()
sẽ làm nhiệm vụ xử lý sự kiện click trên từng item.
Ví dụ: Trong ví dụ này chúng ta sẽ làm ứng dụng gồm có 1 ListView. menu ngữ cảnh sẽ hiện ra khi người sử dụng click và giữ tay trên View
đó trong một khoảng thời gian. Tiến hành tạo project, vào thư mục res /layout -> activity_main.xml thiết kế giao diện sau:
Bước 1: Tạo một project tên là ContextMenu: File->New->Android Application Project điền các thông tin ->Next ->Finish
Bước 2: Mở res -> layout -> xml (hoặc) activity_main.xml và thêm code trong Relaytive Layout.
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.listview.MainActivity" > <ListView android:id="@+id/lstLanguage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="@color/material_blue_grey_800" android:dividerHeight="1dp" /> </RelativeLayout>
Bước 3: Trong tập tin strings.xml
chúng ta định nghĩa danh sách các item dùng cho ListView.
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">MainActivity</string> <string-array name="languages"> <item>Python</item> <item>Java</item> <item>Ruby</item> <item>C++</item> </string-array> </resources>
Bước 4: Trong thư mục res/menu tạo môt tập tin context_menu.xml. Bên trong tập tin này chúng ta sử dụng thẻ menu để khai báo menu
và thẻ item
để khai báo các item
trong menu đó.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/delId" android:title="Delete"/> <item android:id="@+id/upId" android:title="Uppercase"/> <item android:id="@+id/lowId" android:title="Lowercase"/> </menu>
Bước 5: Lấy nguồn dữ liệu từ tập tin string.xml. Chúng ta lưu các item của ListView
trong một đối tượng ArrayList.
String[] languages = getResources().getStringArray(R.array.languages); languages_list = new ArrayList<String>(Arrays.asList(languages));
Bước 6: Muốn dùng menu ngữ cảnh cho View nào thì chúng ta gọi phương thức registerForContextMenu() rồi truyền vào đối tượng View đó.
registerForContextMenu(lstLanguage);
Bước 7: Ghi đè lại phương thức onCreateContextMenu() cho menu ngữ cảnh cũng tương tự như phương thức onCreateOptionsMenu() cho menu tùy chọn vậy, ở đây chúng ta dùng lớp MenuInflater để lấy dữ liệu của menu từ file context_menu.xml.
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); }
Bước 8: Ghi đè lại phương thức onContextItemSelected()
sẽ làm nhiệm vụ xử lý sự kiện click trên từng item.
@Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); int pos = info.position; String i = adapter.getItem(pos); switch (item.getItemId()) { case R.id.delId: languages_list.remove(pos); adapter.notifyDataSetChanged(); return true; case R.id.upId: String upln = i.toUpperCase(); languages_list.set(pos, upln); adapter.notifyDataSetChanged(); return true; case R.id.lowId: String lpln = i.toLowerCase(); languages_list.set(pos,lpln); adapter.notifyDataSetChanged(); return true; default: return super.onContextItemSelected(item); } }
Toàn bộ code trong MainActivity.java
package hiepsiit.com.contextmenu; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity { private ListView lstLanguage; private ArrayAdapter<String> adapter; String [] languages; List<String> languages_list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lstLanguage = (ListView)findViewById(R.id.lstLanguage); languages = getResources().getStringArray(R.array.languages); languages_list = new ArrayList<String>(Arrays.asList(languages)); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, languages_list); lstLanguage.setAdapter(adapter); registerForContextMenu(lstLanguage); } @Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); int pos = info.position; String i = adapter.getItem(pos); switch (item.getItemId()) { case R.id.delId: languages_list.remove(pos); adapter.notifyDataSetChanged(); return true; case R.id.upId: String upln = i.toUpperCase(); languages_list.set(pos, upln); adapter.notifyDataSetChanged(); return true; case R.id.lowId: String lpln = i.toLowerCase(); languages_list.set(pos,lpln); adapter.notifyDataSetChanged(); return true; default: return super.onContextItemSelected(item); } } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); } }
Ứng dụng này được phát triển bởi adt bundle, android 4.2 sử dụng minimum sdk 8 and target sdk 21.
Kết quả khi chạy ứng dụng:
Sau đó click lâu vào ListView
Cập nhật công nghệ từ Youtube tại link: https://www.youtube.com/channel/UCOxeYcvZPGf-mGLYSl_1LuA/videos
Để tham gia khóa học công nghệ truy cập link: http://thuvien.hocviendaotao.com
Mọi hỗ trợ về công nghệ email: dinhanhtuan68@gmail.com