Всплывающее окно закрывается к нижней части экрана - PullRequest
2 голосов
/ 16 января 2020

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

enter image description here

public SelectBucketMenu(Context context) {
        super(context);
        this.mContext = context;

        setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        setOutsideTouchable(true);
        setFocusable(true);
        //Need set windowlayout for API 19 otherwise window won't appear
        setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        setupView();
    }

    private void setupView(){
        View view = LayoutInflater.from(mContext)
                .inflate(R.layout.popupmenu_selectbucket, null);
        ButterKnife.bind(this, view);
        setContentView(view);
    }

Кто-нибудь знает почему?

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Измерение вида, а затем установка высоты устранили мою проблему.

View view = LayoutInflater.from(mContext).inflate(R.layout.popupmenu_addphotos, null);
view.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
setHeight(view.getMeasuredHeight());
0 голосов
/ 22 января 2020

Класс PopupWindow фактически управляет инфляцией для вас.

Просто инициализируйте его следующим образом:

popupWindow.showAsDropDown(view, offsetX, offsetY, gravity);

здесь представление - это точка привязки, над или под которой вы хотите показать всплывающее окно.

0 голосов
/ 19 января 2020

Я заменил следующую строку

setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

на

setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, 0);

и установил высоту всплывающего окна, вызвав метод setHeight.

Окончательный код указан ниже:

public SelectBucketMenu(Context context) {
    super(context);
    this.mContext = context;

    setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    setOutsideTouchable(true);
    setFocusable(true);
    //Need set windowlayout for API 19 otherwise window won't appear
    setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, 0);
    setHeight((int)mContext.getResources().getDimension(R.dimen.bucket_menu_height));
    setupView();
}

Обновление Если вам нужно вычислить высоту всплывающего окна во время выполнения, вы можете найти эту идею в этом ответе . Тогда окончательный код может быть таким, как показано ниже:

public SelectBucketMenu(Context context) {
    super(context);
    this.mContext = context;

    setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    setOutsideTouchable(true);
    setFocusable(true);
    //Need set windowlayout for API 19 otherwise window won't appear
    setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, 0);

    setupView();
}

private void setupView(){
    View view = LayoutInflater.from(mContext)
                .inflate(R.layout.popupmenu_selectbucket, null);
    ButterKnife.bind(this, view);
    setContentView(view);

    int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec. UNSPECIFIED);
    view.measure(spec, spec);
    setHeight(view.getMeasuredHeight());
}

Обновление 2 Следующий код бесполезен, вы можете удалить его.

setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, 0);
...