Элемент положения Android на экране - PullRequest
5 голосов
/ 19 августа 2011

У меня есть просмотр списка, и когда пользователь нажимает кнопку, я хочу собрать координаты кнопки и поместить текст редактирования, который я надуваю, прямо поверх него на экране.Когда пользователь щелкает где-нибудь еще на экране, текст редактирования исчезает, и он запускает метод, который использует данные, введенные пользователем в поле.Как бы я поступил так?Я хотел бы что-то похожее на QuickActions, но не так навязчиво.Может ли кто-нибудь указать мне, по крайней мере, как получить координаты кнопки?

Ответы [ 2 ]

2 голосов
/ 20 августа 2011

Хорошо, вот как я смог добиться того, что я хочу сделать. Можно ли динамически размещать 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 - это размер выбранного всплывающего окна, а vHeight - высота основного родительского представления, которое я собрал в контексте onCreate. Имейте в виду, что это не полированный код. Мне все еще нужно добавить несколько вещей, таких как анимация, а также небольшую стрелку или что-то, чтобы показать, с чем связано окно. SetBackgroundDrawable очень важен, и если вы не используете его, вы не сможете щелкнуть за пределами окна, чтобы закрыть его.

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

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

Грязный, в зависимости от вашей иерархии просмотра.Метод getLeft () (вместе с getRight, getTop и getBottom) относятся к родительскому элементу View элемента управления.Посмотрите на getLocationOnScreen и посмотрите, делает ли он то, что вы хотите.

...