我有一个列表视图,当用户按下按钮时,我想收集按钮的坐标,并在屏幕上放置一个我在其顶部充气的编辑文本。当用户点击屏幕上的任何其他位置时,edittext将消失,它将触发一个方法,该方法使用用户在框中输入的数据。我该怎么做这样的事情?我想要类似于QuickActions的东西,但不是那么具有侵入性。有人能指出我至少如何获得按钮坐标的方向吗?
答案 0 :(得分: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 :(得分:1)
凌乱,具体取决于您的视图层次结构。 getLeft()方法(以及getRight,getTop和getBottom)都是相对于控件的View父级。看看getLocationOnScreen,看看它是否符合您的要求。