2011-08-19 11 views
5

Tengo una vista de lista y cuando el usuario presiona un botón quiero juntar las coordenadas del botón y colocar un texto de edición que inflamos justo encima de él en la pantalla. Cuando el usuario haga clic en cualquier otro lugar de la pantalla, el texto de edición desaparecerá y se activará un método que utiliza los datos que el usuario ingresó en el cuadro. ¿Cómo voy a hacer algo como esto? Me gustaría algo similar a QuickActions, pero no tan intrusivo. ¿Podría alguien apuntarme en la dirección de al menos cómo obtener las coordenadas del botón?Elemento de posición de Android en la pantalla

Respuesta

2

Ok, así que aquí es cómo he podido lograr lo que estoy buscando hacer. ¿Es posible colocar dinámicamente un PopupWindow sin tener que meterse con los márgenes de ajuste etc.

public void showPopup(View view, View parentView, final int getId, String getLbs){ 
    int pWidth = 100; 
    int pHeight = 80; 
    int vHeight = parentView.getHeight(); //The listview rows height. 
    int[] location = new int[2]; 

    view.getLocationOnScreen(location); 
    final View pView = inflater.inflate(R.layout.list_popup, null, false); 
    final PopupWindow pw = new PopupWindow(pView, pWidth, pHeight, false); 
    pw.setTouchable(true); 
    pw.setFocusable(true); 
    pw.setOutsideTouchable(true); 
    pw.setBackgroundDrawable(new BitmapDrawable()); 
    pw.showAtLocation(view, Gravity.NO_GRAVITY, location[0]-(pWidth/4), location[1]+vHeight); 

    final EditText input = (EditText)pView.findViewById(R.id.Input); 
    input.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      Log.i("Focus", "Focus Changed"); 
      if (hasFocus) { 
       //Shows the keyboard when the EditText is focused. 
       InputMethodManager inputMgr = (InputMethodManager)RecipeGrainActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE); 
       inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 
       inputMgr.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT); 
      } 

     } 
    }); 
    input.setText(""); 
    input.requestFocus(); 
    Log.i("Input Has Focus", "" + input.hasFocus()); 
    pw.setOnDismissListener(new OnDismissListener(){ 

     @Override 
     public void onDismiss() { 
      changeWeight(getId, Double.parseDouble(input.getText().toString())); 
      Log.i("View Dismiss", "View Dismissed"); 
     } 

    }); 

    pw.setTouchInterceptor(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { 
       Log.i("Background", "Back Touched"); 
       pw.dismiss(); 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

El pWidth y pHeight son el tamaño de la PopupWindow he elegido y la vHeight es la altura de la vista principal de los padres que he recogido desde el contexto onCreate. Tenga en cuenta que este no es un código pulido. Todavía necesito agregar algunas cosas como entrada y salida animada, así como una pequeña flecha o algo para mostrar a qué ventana se está asociado. El setBackgroundDrawable es muy importante y, si no lo usa, no podrá hacer clic fuera del cuadro para cerrarlo.

En este momento, es raro. Tengo que hacer clic dos veces fuera del cuadro para cerrar la ventana. El primer clic parece resaltar mi cuadro de texto y el segundo clic realmente lo cierra. ¿Alguien tiene alguna idea de por qué podría estar pasando?

1

Desordenado, dependiendo de la jerarquía de su vista. El método getLeft() (junto con getRight, getTop y getBottom) son todos relativos al control View padre. Eche un vistazo al getLocationOnScreen y vea si hace lo que quiere.

+0

getLocationOnScreen parece proporcionarme las coordenadas xey. De hecho, estoy atascado sobre cómo inflar la vista y colocarla en la pantalla. ¿Algunas ideas? – ryandlf

+1

Eso depende del ViewGroup subyacente: si está utilizando algo como LinearLayout o RelativeLayout, realmente no hay una buena manera de hacer un posicionamiento absoluto. Lo que podría intentar es inflarlo en la posición superior izquierda, establecer el tamaño en los valores deseados y luego establecer los márgenes según las coordenadas xey para colocarlo en su lugar. Muy desordenado, pero ... – Femi

+0

Entonces, ¿no hay un método setAtThisLocation (x, y) que pueda usar en un objeto view? Voy a jugar con tu idea y publicar mis resultados. Gracias. – ryandlf

Cuestiones relacionadas