2011-08-19 32 views
5

Tôi có một listview và khi người dùng nhấn một nút Tôi muốn thu thập tọa độ của nút và đặt một văn bản mà tôi thổi phồng ngay trên đầu nó trên màn hình. Khi người dùng nhấp vào bất cứ nơi nào khác trên màn hình, edittext sẽ biến mất và nó sẽ kích hoạt phương thức sử dụng dữ liệu mà người dùng đã nhập vào hộp. Làm thế nào tôi sẽ đi về làm một cái gì đó như thế này? Tôi muốn một cái gì đó tương tự như QuickActions, nhưng không hoàn toàn như xâm nhập. Ai đó có thể chỉ cho tôi theo hướng ít nhất là làm thế nào để đi về nhận được các tọa độ nút?Phần tử vị trí Android trên màn hình

Trả lời

2

Ok, vì vậy, đây là cách tôi đã có thể đạt được những gì tôi đang tìm kiếm. Là nó có thể tự động đặt một PopupWindow mà không cần phải gây rối với lợi nhuận điều chỉnh, vv

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

Các pWidth và pHeight là kích thước của PopupWindow tôi đã chọn và vHeight là chiều cao của quan điểm cha mẹ chính mà tôi thu thập được từ ngữ cảnh onCreate. Hãy nhớ rằng đây không phải là mã đánh bóng. Tôi vẫn cần phải thêm một vài thứ như animate vào và ra cũng như một mũi tên nhỏ đẹp hoặc một cái gì đó để hiển thị những gì các cửa sổ đang được liên kết với. SetBackgroundDrawable là rất quan trọng và nếu bạn không sử dụng nó, bạn sẽ không thể nhấp vào bên ngoài hộp để đóng nó.

Ngay bây giờ, điều kỳ lạ của nó. Tôi phải bấm hai lần bên ngoài hộp để đóng cửa sổ. Nhấp chuột đầu tiên dường như làm nổi bật hộp văn bản của tôi và nhấp chuột thứ hai thực sự đóng nó. Bất cứ ai có bất kỳ ý tưởng tại sao điều đó có thể xảy ra?

1

Lộn xộn, tùy thuộc vào thứ bậc Chế độ xem của bạn. Phương thức getLeft() (cùng với getRight, getTop và getBottom) tất cả đều liên quan đến bố mẹ Xem của kiểm soát. Hãy xem getLocationOnScreen và xem nó có làm những gì bạn muốn không.

+0

getLocationOnScreen dường như cung cấp cho tôi toạ độ x và y. Tôi thực sự bị mắc kẹt về cách tăng lượt xem và đặt nó lên màn hình. Ý tưởng nào? – ryandlf

+1

Điều đó phụ thuộc vào ViewGroup cơ bản: nếu bạn đang sử dụng một cái gì đó như LinearLayout hoặc RelativeLayout có thực sự là không có cách nào tốt để làm vị trí tuyệt đối. Những gì bạn có thể thử là làm tăng nó ở vị trí trên cùng bên trái, thiết lập kích thước cho giá trị mong muốn của bạn và sau đó thiết lập lề dựa trên tọa độ x và y để di chuyển nó vào vị trí. Khá lộn xộn, nhưng ... – Femi

+0

Vì vậy, không có phương thức setAtThisLocation (x, y) nào mà tôi có thể sử dụng đối tượng on.a view? Tôi sẽ chơi xung quanh với ý tưởng của bạn và đăng kết quả của tôi. Cảm ơn. – ryandlf

Các vấn đề liên quan