我有一个 ListView ,当用户按下一个按钮时,我想收集该按钮的坐标,然后在屏幕上的右上方放置一个我会夸大其词的edittext。当用户在屏幕上的其他任何位置单击时,编辑文本将消失,并且将触发一种使用用户在框中输入数据的方法。我将如何去做这样的事情?我想要类似QuickActions的东西,但不那么侵入性。有人可以指出我的方向,至少是如何获得按钮坐标吗?

最佳答案

好的,这就是我能够实现自己想要做的事情的方式。是否有可能动态放置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上下文收集的主父 View 的高度。请记住,这不是完善的代码。我仍然需要添加一些内容,例如动画的进出以及漂亮的小箭头或其他东西,以显示与窗口相关的内容。 setBackgroundDrawable非常重要,如果不使用它,将无法在框外单击以将其关闭。

现在,它很奇怪。我必须在框外单击两次以关闭窗口。第一次单击似乎突出显示了我的文本框,而第二次单击实际上将其关闭。任何人都知道为什么会发生这种情况吗?

关于屏幕上的Android位置元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7116697/

10-10 05:53