2011-08-19 110 views
5

我有一個列表視圖,當用戶按下一個按鈕時,我想收集按鈕的座標並將一個編輯文本放在屏幕上方的頂部。當用戶點擊屏幕上的任何其他位置時,edittext將消失,並且會觸發一種方法,該方法使用用戶輸入框中的數據。我會如何去做這樣的事情?我想要一些類似於QuickActions的東西,但不像侵入式那樣。有人能指出我至少如何去獲得按鈕座標的方向嗎?屏幕上的Android位置元素

回答

2

好吧,所以這裏是我已經能夠實現我想要做的事情。是否有可能動態地放置PopupWindow而不必惹調整邊距等

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

的PWIDTH和pHeight是我選擇了PopupWindow的大小和vHeight是我所收集的主父視圖的高度來自onCreate上下文。請記住,這不是精美的代碼。我仍然需要添加一些東西,比如動畫進出,以及一個漂亮的小箭頭或者什麼東西來顯示窗口的關聯。 setBackgroundDrawable非常重要,如果您不使用它,您將無法在框外單擊以關閉它。

現在,它的奇怪。我必須在框外點擊兩次以關閉窗口。第一次點擊似乎突出了我的文本框,第二次點擊實際上關閉了它。任何人都知道爲什麼會發生這種情況?

1

凌亂,取決於您的視圖層次結構。 getLeft()方法(以及getRight,getTop和getBottom)都與控件的View父級有關。看看getLocationOnScreen,看看它是否做到了你想要的。

+0

getLocationOnScreen似乎爲我提供了x和y座標。實際上我堅持如何膨脹視圖並將其放置在屏幕上。有任何想法嗎? – ryandlf

+1

這取決於底層的ViewGroup:如果您使用的是LinearLayout或RelativeLayout之類的東西,那麼確實沒有什麼好方法可以做到絕對定位。你可能會嘗試的是在左上角的位置膨脹它,將尺寸設置爲你想要的值,然後根據x和y座標設置邊距以將其移動到位。很亂,但... – Femi

+0

所以沒有setAtThisLocation(x,y)方法,我可以使用on.a視圖對象?我會玩你的想法併發布我的結果。謝謝。 – ryandlf