Bài tập 23: Thực hành về Context Menu trong Android


Tiếp nối bài 22, Bài tập này bạn sẽ học về Context Menu một trong những control hữu dụng mà Android cung cấp.

– Đối với C# , VB, hay  Java để hiển thị Context Menu : Sau khi thiết lập Context Menu ta chỉ cần bấm chuột phải vào đổi tượng thì sẽ có Menu Popup ra theo đúng yêu cầu.

– Đối với Android: Chúng ta cũng phải đăng ký Context Menu cho đối tượng sau đó muốn hiển thị lên thì ta nhấn thật lâu vào đối tượng (long click ).

– Tương tự như với Menu, Ta có thể tạo Context menu trong XML hoặc trong Coding.

– Cách tạo Context Menu bằng XML thì nó y xì … như Menu … không khác 1 tí ADN nào cả, nên Tôi sẽ không nói lại cách tạo trong XML. Mà Tôi sẽ nói luôn cách đăng ký Context Menu cho đối tượng cũng như cách xử lý sự kiện cho từng Menu Item trong Context Menu.

– Ở đây Tôi làm một ví dụ đơn giản về Context Menu. Giao diện có 1 Button, khi nhấn thật lâu vào nó thì sẽ hiển thị Context Menu cho phép đổi màu chữ : Màu đỏ, màu xanh lá cây và xanh dương:

23_ctx_0– Ở hình trên là khi Context Menu hiển thị ra, Tôi chọn Red –> Màu của Button sẽ chuyển thành màu đỏ.

– Bạn xem cấu trúc thư mục của Project này và nội dung bên trong của Context menu:

23_ctx_1– Tiếp tục bạn Double click vào strings.xml , Tôi có định nghĩa một số color trong này:

23_ctx_2– Ở trong strings.xml , Tôi tạo 3 tag color : Red, Green, Blue; Nội dung bạn phải để dạng Hex Color. 3 màu này sẽ được triệu gọi trong hàm xử lý sự kiện khi người sử dụng chọn từng Menu Item trong Context Menu.

– Bạn xem nội dung MainActivity.java:


package tranduythanh.com;

import android.os.Bundle;
import android.app.Activity;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.Button;

public class MainActivity extends Activity {

Button btnCtx;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 btnCtx=(Button) findViewById(R.id.btnshowcontext);
 registerForContextMenu(btnCtx);
 }
 @Override
 public void onCreateContextMenu(ContextMenu menu, View v,
 ContextMenuInfo menuInfo) {
 // TODO Auto-generated method stub
 super.onCreateContextMenu(menu, v, menuInfo);
 getMenuInflater()
 .inflate(R.menu.my_context_menu, menu);
 }
 @Override
 public boolean onContextItemSelected(MenuItem item) {
 switch(item.getItemId())
 {
 case R.id.itemRed:
 btnCtx.setTextColor(
 getResources().getColor(R.color.clrred));
 break;
 case R.id.itemGreen:
 btnCtx.setTextColor(
 getResources().getColor(R.color.clrgreen));
 break;
 case R.id.itemBlue:
 btnCtx.setTextColor(
 getResources().getColor(R.color.clrblue));
 break;
 }
 return super.onContextItemSelected(item);
 }
}

– Bạn quan sát dòng lệnh:

+ Dòng lệnh 22 , onCreateContextMenu dùng để nạp Context Menu XML vào ứng dụng

+ Dòng lệnh 30, onContextItemSelected dùng để xử lý sự kiện.

+ Để đăng ký Context Menu cho đối tượng nào thì bạn làm giống như dòng 19:  registerForContextMenu(btnCtx);

getResources().getColor(R.color.clrred) dùng để lấy màu từ XML Resource

+ Như vậy bạn đã biết cách sử dụng Context Menu

+ Bạn có thể tải coding mẫu ở đây: http://www.mediafire.com/?8s368sl4z594y85

– Bài tập sau các bạn sẽ thực hành về Intent, Intent là linh hồn của Android, nó là hạt nhân chính trong Android, các bạn chú ý theo dõi.

Chúc các bạn thành công.

6 responses

  1. Hiếu trần | Reply

    có thể add 2 contextmenu vào trong 1 activity không thầy?

  2. Đúng rồi đấy, chỉ có mỗi một Override cho Class Activity trong khi trong một View có thể có nhiều SubView registerContextMenu(). Chả lẽ lại chia từng trường hợp cho View ah???

  3. Bạn cho hỏi, có thể đưa check box vào từng menu nhỏ được ko. Ý là đưa thêm checkbox vào bên phải của mỗi menu màu. Đưa được thì giúp mình code nhé

    1. Bài 22 thầy Thanh có đưa ví dụ thêm checkbox vào menu item bằng thuộc tính android:checkable=”true”.

      Bạn sẽ phải tự set trạng thái cho checkbox bằng code
      public boolean onOptionsItemSelected(MenuItem item) {
      // Tu set checked/unchecked trong code
      if (item.isChecked()) {
      item.setChecked(false);
      } else {
      item.setChecked(true);
      }
      return super.onOptionsItemSelected(item);
      }

      Trong trường hợp menu thường thì chương trình sẽ nhớ trạng thái của checkbox cho những lần gọi menu sau.

      Trong trường hợp context menu thì bạn phải lưu tạm vào 1 biến bên ngoài.
      Xem link http://stackoverflow.com/questions/9804787/android-checkable-context-menu-not-remembering-checked

  4. many thanks…
    regards 🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: