如何在软键盘等根目录布局的底部设置PopupWindow?

2019年4月27日 18点热度 0条评论

只要焦点在edittext上。
键盘已打开,所有视图均已调整并向上移动,如下面的示例图像所示。

Button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                FileUtils.hideKeyboard(MainActivity.this);
                LayoutInflater layoutInflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View customView = layoutInflater.inflate(R.layout.layout,null);

                DisplayMetrics displayMetrics = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
                int height = displayMetrics.heightPixels;
                int width = displayMetrics.widthPixels;
                popupWindow = new PopupWindow(customView, width, 300);
                //display the popup window
                popupWindow.showAtLocation(rootlayout, Gravity.BOTTOM, 0, 0);
            }
        });

这段代码可以正常工作,但是弹出窗口显示在屏幕底部,并且停留在rootlayout上。

我希望此弹出窗口处于打开状态,并像带有动画的键盘一样保持打开状态。

解决方案如下:

使用所需的任何约束自定义布局并传递布局行为

   app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

在类文件中使用

使用全局变量

   private  BottomSheetBehavior mBottomSheetBehavior = null;

在创建

    layout=(CoordinatorLayout)findViewById(R.id.bottomSheet);
    views=(View)findViewById(R.id.view);
    mBottomSheetBehavior = BottomSheetBehavior.from(views);
    mBottomSheetBehavior.setPeekHeight(0);
    setBottomSheetAndCallBackBottomSheetBehaviour();
    bottomSheetCollapsed();
    layout.setVisibility(View.VISIBLE);

当创建名为method的视图并传递布局ID时,窥视高度将首次用于隐藏视图。

     private void setBottomSheetAndCallBackBottomSheetBehaviour() {

    mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);

   mBottomSheetBehavior.setBottomSheetCallback(new  BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_COLLAPSED) {

                bottomSheetCollapsed();

            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {

        }
    });
}

并使用以下方法展开和折叠。

private void bottomSheetExpand() {

    mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}

private void bottomSheetCollapsed() {

    mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);

}

并点击查看使用

  void isExpendCollapse(){
    if (mBottomSheetBehavior.getState() ==  BottomSheetBehavior.STATE_COLLAPSED){
        bottomSheetExpand();
    }
    else {
        bottomSheetCollapsed();
    }
}

检查xml文件CoordinatorLayout是否必须用于底表行为

 <android.support.design.widget.CoordinatorLayout
    android:id="@+id/bottomSheet"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:clipToPadding="true"
    android:visibility="gone"
    app:behavior_hideable="true"
    app:behavior_peekHeight="0dp"
    android:layout_alignParentBottom="true"

    >



<View
    android:id="@+id/view"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:background="@color/colorAccent"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
   />
</android.support.design.widget.CoordinatorLayout> 

您可以约束布局,线性视图或任何视图,而不是视图。并且我已经设置了相对布局(父布局)的坐标布局,您可以根据需要使用。