Header ads

Header ads
» » ContextMenu

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à ContextMenuFile->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);  	}    }

Download ví dụ

Ứng dụng này được phát triển bởi adt bundleandroid 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

About Học viện đào tạo trực tuyến

Xinh chào bạn. Tôi là Đinh Anh Tuấn - Thạc sĩ CNTT. Email: dinhanhtuan68@gmail.com .
- Nhận đào tạo trực tuyến lập trình dành cho nhà quản lý, kế toán bằng Foxpro, Access 2010, Excel, Macro Excel, Macro Word, chứng chỉ MOS cao cấp, IC3, tiếng anh, phần mềm, phần cứng .
- Nhận thiết kế phần mềm quản lý, Web, Web ứng dụng, quản lý, bán hàng,... Nhận Thiết kế bài giảng điện tử, số hóa tài liệu...
HỌC VIỆN ĐÀO TẠO TRỰC TUYẾN:TẬN TÂM-CHẤT LƯỢNG.
«
Next
Bài đăng Mới hơn
»
Previous
Bài đăng Cũ hơn