Android:PopupWindow、カスタムメニュー


PopupWindowを使用してメニューインタフェースをカスタマイズします.
public class MainActivity extends Activity
{
    /**
     * menu   :
     * 1.  :  menu 
     * 2.  :
     * (1)    menu
     * (2)  menu  
     * (3)  menu(    )     
     * (4)  back 
     * (5)      
     *
     */
                                                          
    private PopupWindow mPopupMenu;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
                                                              
        LayoutInflater inflater = getLayoutInflater();
        View menulayout = inflater.inflate(R.layout.optionmenu_layout, null);
                                                              
        mPopupMenu = new PopupWindow(menulayout, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                                                              
        //      
        menulayout.findViewById(R.id.textView1).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                mPopupMenu.dismiss();
            }
        });
                                                              
        //     layout   
        menulayout.findViewById(R.id.mainmenu).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                mPopupMenu.dismiss();
            }
        });
                                                              
    }
                                                          
      //     
//    @Override
//    public void onBackPressed()
//    {
//        if(mPopupMenu.isShowing())
//        {
//            mPopupMenu.dismiss();
//        }
//        else
//        {
//            super.onBackPressed();
//        }
//    }
                                                         
    //    
    @Override
    protected void onPause()
    {
        if(mPopupMenu.isShowing())
        {
            mPopupMenu.dismiss();
        }
        super.onPause();
    }
                                                          
                                                          
    //  menu     
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if(keyCode == KeyEvent.KEYCODE_MENU)
        {
            if(mPopupMenu.isShowing())
            {
                mPopupMenu.dismiss();
            }
            else
            {
                mPopupMenu.showAtLocation(findViewById(R.id.main), Gravity.BOTTOM, 0, 0);
            }
            return true;
        }
        if(keyCode == KeyEvent.KEYCODE_BACK)
        {
            if(mPopupMenu.isShowing())
            {
                mPopupMenu.dismiss();
            }
          else
          {
              finish();
          }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
                                                          
                                                          
                                                          
                                                          
                                                          
    //4.2            
    /**
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        if(mPopupMenu.isShowing())
        {
            mPopupMenu.dismiss();
        }
        else
        {
            mPopupMenu.showAtLocation(findViewById(R.id.main), Gravity.BOTTOM, 0, 0);
        }
        //   false,    menu    onCreateOptionsMenu  ,           
        return false;
    }
    */
                                                          
}

PopupWindowに関するまとめ:
1.PopupWindow外領域をクリックしてPopupWindowを閉じ、PopupWindowを傍受する
//        ,           
mPhoneMenu.setBackgroundDrawable(getResources().getDrawable(R.color.emptylayout_bg));//      setOutsideTouchable   
mPhoneMenu.setFocusable(true);// menu      ,menu           
mPhoneMenu.setOutsideTouchable(false);//    menu       menu
mPhoneMenu.update();//    update  
//       ,      
mPhoneMenu.setOnDismissListener(new OnDismissListener()
{
    @Override
    public void onDismiss()
    {
        showBottomMenu();
    }
});

2.WindowManager$BadTokenExceptionエラー解決方法
http://glblong.blog.51cto.com/3058613/1306012
3.あるビューの相対位置にメニューを指定する
                    
                    popupWindow = new PopupWindow(layout,120,120);  //        ,popupWindow.getHeight()   
                    popupWindow.setFocusable(true);  
                    popupWindow.setOutsideTouchable(true);  
                    popupWindow.setBackgroundDrawable(new BitmapDrawable());  

                    int[] location = new int[2];//      view       
                    view.getLocationOnScreen(location);

                    popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0], location[1]-popupWindow.getHeight());

本文は“空は痕跡がありませんが私は飛んだことがあります”のブログから出て、転載して作者と連絡してください!