Android PopupWindow не закрывается - PullRequest
2 голосов
/ 21 августа 2011

У меня есть следующий код, который создает PopupWindow, содержащее EditText:

lbs.setOnTouchListener(new OnTouchListener(){

        @Override
        public boolean onTouch(View v, MotionEvent arg1) {
            int pWidth = 100;
            int pHeight = 80;
            int vHeight = mView.getHeight();
            int[] location = new int[2];
            v.getLocationOnScreen(location);
            final View view = inflater.inflate(R.layout.list_popup, null, false);
            final PopupWindow pw = new PopupWindow(view, pWidth, pHeight, false);
            pw.setTouchable(true);
            //pw.setFocusable(true);
            pw.setOutsideTouchable(true);
            pw.setBackgroundDrawable(new BitmapDrawable());
            pw.setContentView(view);
            pw.showAtLocation(v, Gravity.NO_GRAVITY, location[0]-(pWidth/4), location[1]+vHeight);
            //final LinearLayout layout = (LinearLayout)view.findViewById(R.id.PopupLayout);

            final EditText input = (EditText)view.findViewById(R.id.Input);
            input.setOnFocusChangeListener(new View.OnFocusChangeListener() {

                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    Log.i("Focus", "Focus Changed");
                    /*
                    if (hasFocus) {
                        InputMethodManager inputMgr = (InputMethodManager)myContext.getSystemService(Context.INPUT_METHOD_SERVICE);
                        inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                        inputMgr.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
                    }
                    */

                }
            });
            input.setText(lbs.getText().toString());
            input.requestFocus();
            pw.setOnDismissListener(new OnDismissListener(){

                @Override
                public void onDismiss() {
                    parentActivity.changeWeight(getId, Double.parseDouble(input.getText().toString()));
                    Log.i("View Visibility", "" + view.getVisibility());
                }

            });

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

            return true;
        }   
    });

У PopupWindows есть setBackGroundDrawable, так что когда пользователь касается окна, окно должно автоматически закрываться. Я знаю, что окно закрывается, потому что мой метод OnDismiss запускается, когда я щелкаю за пределами окна, но фактическое окно не исчезает, пока я не коснусь дважды за пределами окна, и из-за этого onDismiss запускается дважды, чего у меня не может быть. Что мне здесь не хватает?

РЕДАКТИРОВАТЬ: я немного обновил свой код. Если я не фокусируюсь на всплывающем окне, все работает отлично, за исключением того факта, что я не могу сфокусироваться на своем тексте редактирования. Если я сделаю setFocusable для всплывающего окна, текст редактирования не сразу получит фокус, и мне придется дважды щелкнуть, чтобы удалить его.

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Я думаю, вы можете открывать более одного всплывающего окна. Метод onTouch будет вызываться, по крайней мере, для касания и касания, и, вероятно, пара касаний также перемещается туда. Попробуйте проверить (arg1.getAction () == MotionEvent.ACTION_UP) и показать окно только тогда.

1 голос
/ 31 августа 2011

Ваше всплывающее окно не получает контекст родительской активности.Попробуйте сделать так вместо "final PopupWindow pw = new PopupWindow (view, pWidth, pHeight, false);"

final PopupWindow pw = new PopupWindow(getApplicationContext());
pw.setContentView(view);
pw.setHeight(pHeight);
pw.setWidth(pWidth);
pw.setFocusable(false);
...