Menu thả xuống / cửa sổ bật lên tùy chỉnh Android


127

Làm cách nào để thực hiện trình đơn thả xuống / cửa sổ bật lên tùy chỉnh được neo vào một nút?

Tôi cần nó để hoạt động như menu bật lên (được neo vào một khung nhìn) và làm một cái gì đó khi tôi nhấp vào một mục từ menu.

Làm cách nào để thêm các mục vào menu theo mã, giữ chiều cao của menu và làm cho nó có thể cuộn được nếu có nhiều hơn 5 mục. Tôi không cần thêm bất kỳ hình ảnh nào, chỉ cần văn bản.

nhập mô tả hình ảnh ở đây

Câu trả lời:


315

Cập nhật : Để tạo một menu bật lên trong Android với Kotlin, hãy tham khảo câu trả lời của tôi ở đây .

Để tạo một menu bật lên trong Android với Java:

Tạo một tập tin bố trí activity_main.xmltrong res/layoutthư mục chỉ chứa một nút.

Tên tệp: activity_main.xml

<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=".MainActivity" >  

    <Button  
        android:id="@+id/button1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignParentLeft="true"  
        android:layout_alignParentTop="true"  
        android:layout_marginLeft="62dp"  
        android:layout_marginTop="50dp"  
        android:text="Show Popup" />  

</RelativeLayout>  

Tạo một tập tin popup_menu.xmltrong res/menuthư mục

Nó chứa ba mục như hình dưới đây.

Tên tệp: poupup_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >  

    <item  
        android:id="@+id/one"  
        android:title="One"/>  

    <item  
        android:id="@+id/two"  
        android:title="Two"/>  

    <item  
        android:id="@+id/three"  
        android:title="Three"/>  

</menu>  

Lớp MainActivity hiển thị menu bật lên khi nhấp vào nút.

Tên tệp: MainActivity.java

public class MainActivity extends Activity {  
    private Button button1;  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //Creating the instance of PopupMenu
                PopupMenu popup = new PopupMenu(MainActivity.this, button1);
                //Inflating the Popup using xml file
                popup.getMenuInflater()
                    .inflate(R.menu.popup_menu, popup.getMenu());

                //registering popup with OnMenuItemClickListener
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(
                            MainActivity.this,
                            "You Clicked : " + item.getTitle(),
                            Toast.LENGTH_SHORT
                        ).show();
                        return true;
                    }
                });

                popup.show(); //showing popup menu
            }
        }); //closing the setOnClickListener method
    }
}

Để thêm lập trình:

PopupMenu menu = new PopupMenu(this, view);

menu.getMenu().add("One");
menu.getMenu().add("Two");
menu.getMenu().add("Three");

menu.show();

Theo liên kết này để tạo menu lập trình.


Hey cảm ơn bạn!! Nếu tôi muốn thêm nhiều món vào menu thì sao ?. Tôi có thể làm điều đó bằng mã?
stanete

chào mừng .. có, bạn có thể thêm nhiều mục hơn trong popup_menu.xml
Shylendra Madda

3
Ok tôi đã tìm ra cách thêm các mục: menu.getMothy (). Add ("item"); Nhưng làm thế nào tôi có thể tùy chỉnh menu?
stanete

1
Bây giờ nó cũng có thể được sử dụng trong các phiên bản thấp hơn, tức là dưới 3.0 (tổ ong) bằng cách sử dụng thư viện hỗ trợ compat v7 ..
AndroidMech

1
<item android: id = "@ + id / google_plus" android: title = "@ string / menu_google_plus" android: icon = "@ drawable / add_by_gp" android: showAsAction = "ifRoom | withText" /> đây là cách tôi đã thêm, nhưng tôi không thể nhìn thấy hình ảnh với văn bản
Mr.G

8

Tôi biết đây là một câu hỏi cũ, nhưng tôi đã tìm thấy một câu trả lời khác phù hợp hơn với tôi và dường như nó không xuất hiện trong bất kỳ câu trả lời nào.

Tạo bố cục xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dip"
    android:paddingBottom="5dip"
    android:paddingStart="10dip"
    android:paddingEnd="10dip">

<ImageView
    android:id="@+id/shoe_select_icon"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_gravity="center_vertical"
    android:scaleType="fitXY" />

<TextView
    android:id="@+id/shoe_select_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textSize="20sp"
    android:paddingStart="10dp"
    android:paddingEnd="10dp"/>

</LinearLayout>

Tạo ListPopupWindow và bản đồ với nội dung:

ListPopupWindow popupWindow;
List<HashMap<String, Object>> data = new ArrayList<>();
HashMap<String, Object> map = new HashMap<>();
    map.put(TITLE, getString(R.string.left));
    map.put(ICON, R.drawable.left);
    data.add(map);
    map = new HashMap<>();
    map.put(TITLE, getString(R.string.right));
    map.put(ICON, R.drawable.right);
    data.add(map);

Sau đó, nhấp chuột, hiển thị menu bằng chức năng này:

private void showListMenu(final View anchor) {
    popupWindow = new ListPopupWindow(this);

    ListAdapter adapter = new SimpleAdapter(
            this,
            data,
            R.layout.shoe_select,
            new String[] {TITLE, ICON}, // These are just the keys that the data uses (constant strings)
            new int[] {R.id.shoe_select_text, R.id.shoe_select_icon}); // The view ids to map the data to

    popupWindow.setAnchorView(anchor);
    popupWindow.setAdapter(adapter);
    popupWindow.setWidth(400);
    popupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            switch (position){
                case 0:
                    devicesAdapter.setSelectedLeftPosition(devicesList.getChildAdapterPosition(anchor));
                    break;
                case 1:
                    devicesAdapter.setSelectedRightPosition(devicesList.getChildAdapterPosition(anchor));
                    break;
                default:
                    break;
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    devicesAdapter.notifyDataSetChanged();
                }
            });
            popupWindow.dismiss();
        }
    });
    popupWindow.show();
}

6

Con đường Kotlin

fun showPopupMenu(view: View) {
    PopupMenu(view.context, view).apply {
                menuInflater.inflate(R.menu.popup_men, menu)
                setOnMenuItemClickListener { item ->
                    Toast.makeText(view.context, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show()
                    true
                }
            }.show()
}

CẬP NHẬT: Trong đoạn mã trên, hàm áp dụng trả về thiskhông bắt buộc, vì vậy chúng ta có thể sử dụng runmà không trả về bất cứ thứ gì và để đơn giản hơn nữa, chúng ta cũng có thể loại bỏ các dấu ngoặc nhọn của phương thức showPopupMothy.

Ngay cả đơn giản hơn:

fun showPopupMenu(view: View) = PopupMenu(view.context, view).run {
            menuInflater.inflate(R.menu.popup_men, menu)
            setOnMenuItemClickListener { item ->
                Toast.makeText(view.context, "You Clicked : ${item.title}", Toast.LENGTH_SHORT).show()
                true
            }
            show()
        }

3

Đầu tiên, hãy tạo một thư mục có tên là menu Menu trong thư mục của res res.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="Search"/>
    <item
        android:id="@+id/add"
        android:icon="@android:drawable/ic_menu_add"
        android:title="Add"/>
    <item
        android:id="@+id/edit"
        android:icon="@android:drawable/ic_menu_edit"
        android:title="Edit">
        <menu>
            <item
                android:id="@+id/share"
                android:icon="@android:drawable/ic_menu_share"
                android:title="Share"/>
        </menu>
    </item>

</menu>

Sau đó, tạo Lớp hoạt động của bạn:

public class PopupMenu1 extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.popup_menu_1);
    }

    public void onPopupButtonClick(View button) {
        PopupMenu popup = new PopupMenu(this, button);
        popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu());

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(PopupMenu1.this,
                        "Clicked popup menu item " + item.getTitle(),
                        Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        popup.show();
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.