Bài 12: Menu trong Android – Lập trình Android cơ bản

Đăng bởi : Admin | Lượt xem : 4644 | Chuyên mục : Android

1. Tổng quan về menu trong Android

Menu là một thành phần giao diện người dùng thông dụng trong nhiều loại ứng dụng. Để phân phối một thưởng thức người dùng quen thuộc và đồng nhất, bạn nên sử dụng những API Menu để trình diễn hành vi người dùng và những tùy chọn khác trong hoạt động giải trí của mình .

Bắt đầu với Android 3.0 (API mức 11), các thiết bị dựa trên nền tảng Android không còn phải cung cấp một nút Menu chuyên dụng nữa. Với sự thay đổi này, các ứng dụng Android cần tránh khỏi sự phụ thuộc vào bảng điều khiển menu 6 mục truyền thống này mà thay vào đó cung cấp một thanh hành động để trình bày các hành động người dùng thông dụng.

Menu trong Android có 2 loại menu chính là : OptionMenu và ContextMenu. Trong bài viết này chúng ta sẽ tìm hiểu lần lượt các loại menu trong Android.

2. OptionMenu

2.1. Thao tác với file XML

Option Menu là loại menu nằm trên ActionBar hoặc Toolbar ở phía bên phải. Menu hiển thị dưới dạng text, text + icon hoặc icon “ ba chấm ”, menu cũng tương hỗ tùy biến giao diện .

Để tạo menu đầu tiên bạn vào click chuột phải vào mục res – New – Android Resource Directory để tạo một thư mục chứa menu và lưu ý là bạn phải đặt chính xác tên thư mục là menu.  

Sau khi hoàn thành ta có thư mục menu chứa file option_menu.xml

Từ sau phiên bản android 3.0 và API > 11 thì android chuyển sang hiển thị OptionMenu trên thanh ActionBar thay vì hiển thị dưới dạng 6 nút cổ xưa như trước đây dù vậy việc thực thi tạo một menu vẫn không biến hóa .

Để tạo các ra menu ta dùng các thẻ  

Trong thẻ item có những thuộc tính ta cần quan tâm :

  1. id : dùng để tham chiếu tới item 
  2. title : tiêu đề của item
  3. icon : hiển thị icon 

&ltmenu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    &ltitem android:id="@+id/item1"
        android:title="Item1"
        android:icon="@drawable/ic_search_black_24dp"
        android:orderInCategory="100"
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.widget.SearchView"
        />
    &ltitem android:id="@+id/item2"
        android:title="Item2"
        android:icon="@drawable/ic_people_black_24dp"
        android:orderInCategory="100"
        app:showAsAction="withText" />

    &ltitem android:id="@+id/item3"
        android:title="Item3"
        android:icon="@drawable/ic_settings_black_24dp"
        android:orderInCategory="100"
        app:showAsAction="withText" />
    &ltitem android:id="@+id/item4"
        android:title="Item4"
        android:icon="@drawable/ic_photo_camera_black_24dp"
        android:orderInCategory="100"
        app:showAsAction="withText" />

Tạo menu con trong menu .

&ltgroup
        android:id="@+id/group1"
        android:checkableBehavior="none">

        &ltitem android:id="@+id/item5"
            android:title="Item5"
            android:icon="@drawable/ic_security_black_24dp"
            android:orderInCategory="100"
            app:showAsAction="withText" />


        &ltitem android:id="@+id/item6"
            android:title="Item6"
            android:icon="@drawable/abc_vector_test"
            android:orderInCategory="100"
            app:showAsAction="collapseActionView" >

            &ltmenu>
                &ltitem android:id="@+id/item6.1" android:title="item 6.1"/>
                &ltitem android:id="@+id/item6.2" android:title="item 6.2"/>
            

2.2. Thao tác với MainActivity.java

Trong MainActivity,java ta tiến hành Override hàm onCreateOptionMenu để tham chiếu tới menu

Gọi hàm getMenuInflater() để tạo một MenuInflater (MenuInflater không thể khởi tạo với “new MenuInflater()” mà dùng hàm getMenuInflater() ).

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.option_menu,menu);
        MenuItem menuItem = menu.findItem(R.id.item1);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
        return super.onCreateOptionsMenu(menu);

    }

Tiếp theo ta tiến hành cho MenuInflater().inflate(R.menu.mymenu,menu)  . Trong hàm inflate() tham số thứ nhất là menu cần lấy ra để tạo, tham số thứ 2 là OptionMenu. Vậy là chúng ta đã tạo xong một OptionMenu,

còn những dòng code có comment là dùng để lấy ra ActionView của một Item, ở đây mình lấy ra cái SearchView của item ĐK .

Để gán sự kiện cho các item trong menu ta tiến hành Override hàm onOptionsItemSelected.

@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        switch (id){
            case R.id.item2:
                Toast.makeText(getBaseContext(),"item2",Toast.LENGTH_LONG).show();
                break;
            case R.id.item3:
                Toast.makeText(getBaseContext(),"item3",Toast.LENGTH_LONG).show();
                break;
            case R.id.item4:
                Toast.makeText(getBaseContext(),"item4",Toast.LENGTH_LONG).show();
                break;
            case R.id.item5:
                Toast.makeText(getBaseContext(),"item5",Toast.LENGTH_LONG).show();
                break;
            case R.id.item6:
                Toast.makeText(getBaseContext(),"item6",Toast.LENGTH_LONG).show();
                break;
            case R.id.item6_1:
                Toast.makeText(getBaseContext(),"item6.1",Toast.LENGTH_LONG).show();
            case R.id.item6_2:
                Toast.makeText(getBaseContext(),"item6.2",Toast.LENGTH_LONG).show();
            default:

        }
        return super.onOptionsItemSelected(item);
    }

3. ContextMenu 

Context menu xuất hiện khi người dùng tác động lên một view nào đó. Chẳng hạn khi người dùng long click vào Listview, một vài thao tác được hiển thị để người dùng lựa chọn (context menu).

Giống như OptionMenu ta cũng cần phải tạo một file menu đặt tên là context_menu như ở trên.

File XML :


&ltmenu xmlns:android="http://schemas.android.com/apk/res/android">
&ltitem android:id="@+id/context1"
    android:title="context menu 1" 
    android:icon="@drawable/ic_settings_black_24dp"/>

&ltitem android:id="@+id/context2" 
    android:title="context menu 2" 
    android:icon="@drawable/ic_settings_black_24dp"/>


Trong giao diện của MainActivity ta thêm 1 nút như hình :

Ở trong Hàm MainActivity.java chúng ta thêm 2 hàm để định nghĩa ContextMenu view của nó.

@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        if (v == btn){
            getMenuInflater().inflate(R.menu.context_menu,menu);
        }
    }

    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.context1:
                Toast.makeText(getBaseContext(),"context1",Toast.LENGTH_LONG).show();
        }
        return super.onContextItemSelected(item);
    }

Không quên trong hàm onCreate thêm registerForContextMenu(btn); để nhận view.

 ContextMenu còn được ứng dụng trong nhiều trường hợp khác như hiển thi  thông tin của một phần tử lisview, thêm lựa chọn cho các button ….. bài viết chỉ giới thiệu một phần nhỏ trong các ứng dụng của OptionMenu ContextMenu các bạn cần tìm hiểu nhiều hơn để nắm chắc kiến thức này.