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
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?
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.
getLocationOnScreen sembra fornirmi le coordinate xey. In realtà sono bloccato su come gonfiare la vista e posizionarla sullo schermo. Qualche idea? – ryandlf
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
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