ProgramingTip

프로그래밍 방식으로 PopupMenu 메뉴 항목 설정

bestdevel 2020. 11. 22. 20:23
반응형

프로그래밍 방식으로 PopupMenu 메뉴 항목 설정


나는 PopupMenu연결하는 일반적인 방법이 사용하는 것임을 알고 popup.getMenuInflater().inflate(R.menu.my_menu, popup.getMenu());있습니다. 내 문제는 메뉴에 원하는 항목의 배열이 있고 Java에서 프로그래밍 방식으로 표현 수있는 것입니다. 어떻게 할 수 있습니까?


그냥 알아 냈어요. 이 같은 문제가 발생하는 사람은 다음과 같이합니다.

popup.getMenu().add(groupId, itemId, order, title);

MenuItem추가하려는 추가 에 대해 .


아래에 팝업이 표시되는 팝업 메뉴를 만들고 getMenu () 메소드를 사용하여 값을 추가하면됩니다. 보여 주다 (); 잊지 마세요.

PopupMenu menu = new PopupMenu(this, view);

menu.getMenu().add("titleRes");
menu.show();

이 시도 :

Dynamic_PopUpMenu.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        PopupMenu menu = new PopupMenu(DialogCheckBox.this, v);
        menu.getMenu().add("AGIL");         
        menu.getMenu().add("AGILarasan");
        menu.getMenu().add("Arasan");
        menu.show();
    }
});

popupmenu.xml에서 ID를 정의합니다.

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

        <item
            android:id="@+id/slot1"
            app:showAsAction="ifRoom|withText"
            android:title="Movies"
            android:visible="true"/>
        <item
            android:id="@+id/slot2"
            app:showAsAction="ifRoom|withText"
            android:title="Music"
            android:visible="true"/>
        <item
            android:id="@+id/slot3"
            app:showAsAction="ifRoom|withText"
            android:title="Comedy"
            android:visible="true"/>

</menu>  

PopupMenu popupMenu = new PopupMenu(FullMenuActivity.this, view);                      
popupMenu.setOnMenuItemClickListener(FullMenuActivity.this);
popupMenu.getMenu().add(1, R.id.slot1, 1, "slot1");
popupMenu.getMenu().add(1,R.id.slot2,2,"slot2");
popupMenu.getMenu().add(1,R.id.slot3,3,"slot3");
popupMenu.show();

 @Override
    public boolean onMenuItemClick(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.slot1:
                SessionManager.selected_slot = item.getTitle().toString();
                Toast.makeText(this, "slot1 Clicked", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.slot2:
                SessionManager.selected_slot = item.getTitle().toString();
                Toast.makeText(this, "slot2 Clicked", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.slot3:
                SessionManager.selected_slot = item.getTitle().toString();
                Toast.makeText(this, "slot3 Clicked", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return true;
        }
    }


다음은 ID가 설정되고 처리되는 완전한 솔루션입니다.

        this.findViewById(R.id.hamburger_menu).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            PopupMenu menu = new PopupMenu(getApplicationContext(), v);
            menu.getMenu().add(Menu.NONE, 1, 1, "Share");
            menu.getMenu().add(Menu.NONE, 2, 2, "Comment");
            menu.show();

            menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {

                    int i = item.getItemId();
                    if (i == 1) {
                        //handle share
                        return true;
                    } else if (i == 2) {
                        //handle comment
                        return true;
                    } else {
                        return false;
                    }
                } 

            });
         }
     });

참고 : 공유 및 주석은 예를 들어 숫자 1,2에 상수를 넣어 코드를 더 읽기 쉽게 만들 수 있습니다.

또한 Menu.NONE메뉴 항목을 그룹화하는 데 신경 쓰지 않기 때문에 넣었습니다 . 그룹 세트 그룹 ID = 1, 2 등으로 만들고 싶은 경우 ...


@Voora Tarun이 좋은 대답을했고 이에 근거하여 대답했습니다. 먼저 가짜 mune.xml리소스를 사용하는 ids대신 파일 을 만드는 것이 더 나은 방법이라고 생각 합니다.

ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="menuGroup" type="id"/>
    <item name="menu1" type="id"/>
    <item name="menu2" type="id"/>
    <item name="menu3" type="id"/>
</resources>

그런 다음 다음과 같이 할 수 있습니다.

private void showPopup(final View anchor) {
        PopupMenu popupMenu = new PopupMenu(anchor.getContext(), anchor);
        popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE, "slot1");
        popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE,"slot2");
        popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE,"slot3");
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(anchor.getContext(), item.getTitle() + "clicked", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        popupMenu.show();
    }

 private void getPopup(final TextView textView, ArrayList<String> arrayList) {
        final PopupMenu popupMenu = new PopupMenu(sContext, textView);
        for (int i = 0; i < arrayList.size(); i++) {
            popupMenu.getMenu().add(i, Menu.FIRST, i, arrayList.get(i));
        }
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                textView.setText(item.getTitle());
                return false;
            }
        });
        popupMenu.show();
    }

참고 URL : https://stackoverflow.com/questions/13784088/setting-popupmenu-menu-items-programmatically

반응형