androidpopupmenu

How to pass a custom layout to a PopupMenu?


I want to customize the popupmenu in android, default popup menu gives more space ,so I'm trying to change the custom layout in popup menu but I cant figure out how.

enter image description here

Note: I want to do this small popup design so I go with default popup menu but i want to customize it.

findViewById(R.id.menuclick).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        PopupMenu popupMenu = new PopupMenu(Sample1.this, view);
        popupMenu.setOnMenuItemClickListener(Sample1.this);
        popupMenu.inflate(R.layout.menus_layout);
        popupMenu.show();
    }
});

Solution

  • To inflate popupMenu from a button onClick, use the following code.

    btn = (Button) findViewById(R.id.btn);   
    btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popup = new PopupMenu(MainActivity.this, v);
                popup.getMenuInflater().inflate(R.menu.pop_up, popup.getMenu());
    
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(MainActivity.this, "Some Text" + item.getTitle(), Toast.LENGTH_SHORT).show();
                        return true;
                    }
                });
                popup.show();//showing popup menu
            }
        });
    

    EDIT

    To style the popupMenu, add the following style.

    <style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
            <item name="android:popupBackground">#ffffff</item>
        </style>
    

    I noticed you also want to add icons next to your text. It is possible to add icons in popupMenu. However it is a better approach to use popup Window instead. Here is a sample code:

    PopupWindow mypopupWindow;
    setPopUpWindow();  
         btn=(Button)findViewById(R.id.btn);  
         btn.setOnClickListener(new View.OnClickListener() {  
           @Override  
           public void onClick(View v) {              
               mypopupWindow.showAsDropDown(v,-153,0);  
               //showAsDropDown(below which view you want to show as dropdown,horizontal position, vertical position)  
             }  
           }  
         });  
       }  
       private void setPopUpWindow() {  
         LayoutInflater inflater = (LayoutInflater)  
             getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
         view = inflater.inflate(R.layout.popup, null);  
    
         Start=(RelativeLayout)view.findViewById(R.id.start_btn);  
         Pause=(RelativeLayout)view.findViewById(R.id.pause_btn);  
         Stop=(RelativeLayout)view.findViewById(R.id.stop_btn);
    
      mypopupWindow = new PopupWindow(view,300, RelativeLayout.LayoutParams.WRAP_CONTENT, true);
    

    popup Layout

    <?xml version="1.0" encoding="utf-8"?>  
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
       android:orientation="vertical" android:layout_width="wrap_content"  
       android:background="@drawable/whitedrawable"  
       android:paddingRight="0dp"  
       android:layout_marginRight="0dp"  
       android:layout_height="wrap_content">  
       <RelativeLayout  
         android:id="@+id/btn1"  
         android:layout_width="wrap_content"  
         android:layout_height="wrap_content">  
         <ImageView  
           android:layout_centerHorizontal="true"  
           android:layout_centerVertical="true"  
           android:layout_alignParentLeft="true"  
           android:layout_width="wrap_content"  
           android:layout_height="wrap_content"  
           android:src="@drawable/startimg"  
           android:id="@+id/startimg"  
           android:paddingLeft="10dp"  
           android:paddingRight="10dp"  
           android:paddingTop="5dp"  
           android:paddingBottom="5dp"  
           />  
         <TextView  
           android:layout_centerHorizontal="true"  
           android:layout_centerVertical="true"  
           android:layout_width="wrap_content"  
           android:layout_height="wrap_content"  
           android:paddingRight="0dp"  
           android:text="Start"  
           android:layout_toRightOf="@+id/startimg"  
           />  
     <!-- Continue for other items-->
    

    The whitedrawable can be used to set a background of your choice. You can use 9patch to get the shadow and rounded corners for the background.

    To dismiss the popupWindow, use the following code:

    mypopupWindow.getContentView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mypopupWindow.dismiss();
        }
    });
    

    To dismiss using the back button, use:

    @Override
    public void onBackPressed() {
        if(mypopupWindow.isShowing()) {
            mypopupWindow.dismiss();
            return;
        }
        super.onBackPressed();
    }