2011-08-19 2 views
5

Ho una vista elenco e quando l'utente preme un pulsante, desidero raccogliere le coordinate del pulsante e posizionare un edittoxt su cui giace sopra lo schermo. Quando l'utente fa clic in un punto qualsiasi dello schermo, l'edittext sparirà e verrà generato un metodo che utilizza i dati inseriti dall'utente nella casella. Come potrei fare qualcosa di simile? Vorrei qualcosa di simile a QuickActions, ma non così invadente. Qualcuno potrebbe indicarmi la direzione di come ottenere le coordinate del pulsante?Elemento posizione Android sullo schermo

risposta

2

Ok, ecco come sono stato in grado di ottenere quello che sto cercando di fare. È possibile posizionare dinamicamente un PopupWindow senza dover pasticciare con margini di regolazione ecc

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; 
     } 
    }); 
} 

Il pwidth e pHeight sono le dimensioni della PopupWindow ho scelto e il vheight è l'altezza del principale vista primaria che ho raccolto dal contesto onCreate. Tieni presente che questo codice non è lucido. Ho ancora bisogno di aggiungere alcune cose come animate dentro e fuori, oltre a una bella piccola freccia o qualcosa per mostrare a cosa è associata la finestra. SetBackgroundDrawable è molto importante e se non lo usi non potrai fare clic all'esterno della finestra per chiuderlo.

In questo momento, è strano. Devo fare clic due volte all'esterno della finestra per chiudere la finestra. Il primo clic sembra solo evidenziare la mia casella di testo e il secondo clic lo chiude in realtà. Qualcuno ha idea del perché possa accadere?

1

Disordinato, in base alla gerarchia View. Il metodo getLeft() (insieme a getRight, getTop e getBottom) sono tutti relativi al controllo Visualizza del controllo. Dai un'occhiata a getLocationOnScreen e vedi se fa quello che vuoi.

+0

getLocationOnScreen sembra fornirmi le coordinate xey. In realtà sono bloccato su come gonfiare la vista e posizionarla sullo schermo. Qualche idea? – ryandlf

+1

Dipende dal ViewGroup sottostante: se stai usando qualcosa come LinearLayout o RelativeLayout, non c'è davvero un buon modo per fare il posizionamento assoluto. Quello che potresti provare è gonfiarlo nella posizione in alto a sinistra, impostare la dimensione sui valori desiderati e quindi impostare i margini in base alle coordinate xey per spostarlo in posizione. Abbastanza caotico, ma ... – Femi

+0

Quindi non esiste un metodo setAtThisLocation (x, y) che possa essere utilizzato su un oggetto di visualizzazione? Giocherò con la tua idea e pubblicherò i miei risultati. Grazie. – ryandlf