¿Cómo mostrar PopupWindow en una ubicación especial?

Necesito mostrar PopupWindow en una Views muestra en la pantalla.

¿Cómo puedo calcular las coordenadas de la View necesaria y colocar PopupWindow debajo de ella? El ejemplo del código es más que bienvenido. Gracias.

    Ubicar una vista ya mostrada es bastante fácil; esto es lo que uso en mi código:

     public static Rect locateView(View v) { int[] loc_int = new int[2]; if (v == null) return null; try { v.getLocationOnScreen(loc_int); } catch (NullPointerException npe) { //Happens when the view doesn't exist on screen anymore. return null; } Rect location = new Rect(); location.left = loc_int[0]; location.top = loc_int[1]; location.right = location.left + v.getWidth(); location.bottom = location.top + v.getHeight(); return location; } 

    A continuación, podría usar un código similar al que Ernesta sugirió para insertar la ventana emergente en la ubicación relevante:

     popup.showAtLocation(parent, Gravity.TOP|Gravity.LEFT, location.left, location.bottom); 

    Esto mostraría la ventana emergente directamente debajo de la vista original; sin embargo, no hay garantía de que haya espacio suficiente para mostrar la vista.

    tiene getLeft() y getBottom() para obtener la posición exacta de la vista en el diseño. También tiene getWidth() y getHeight() para conocer el espacio exacto ocupado por la vista. Si desea ubicar su ventana emergente debajo de una vista.

    setLeft() métodos setLeft() y setTop() de la vista para colocar la nueva ventana emergente.

    Para obtener el tamaño de la pantalla principal de la aplicación sin elementos como barras de título y notificación, anule el siguiente método en la clase que genera la pantalla en cuestión (los tamaños se miden en píxeles):

     @Override protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); } 

    Para obtener la coordenada inferior de la vista en la que desea mostrar la ventana emergente:

     View upperView = ... int coordinate = upperView.getBottom(); 

    Ahora, siempre que la height - coordinate sea ​​lo suficientemente grande para su vista emergente, simplemente puede colocar la ventana emergente de esta manera:

     PopupWindow popup = new PopupWindow(); Button button = new Button(this); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { popup.showAtLocation(parent, Gravity.CENTER, 0, coordinate); } }); 

    Aquí, showAtLocation() toma la vista principal como un argumento junto con los desplazamientos de gravedad y ubicación.