如何在根布局底部设置 PopupWindow,如软键盘?

Posted

技术标签:

【中文标题】如何在根布局底部设置 PopupWindow,如软键盘?【英文标题】:How to set PopupWindow at bottom of root layout like soft keyboard? 【发布时间】:2020-05-01 23:50:15 【问题描述】:

只要焦点在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 上。 我希望这个弹出窗口是打开的,并保持像带有动画的键盘一样。

【问题讨论】:

【参考方案1】:

使用您想要的任何约束自定义布局并传递布局行为

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

在创建视图时调用方法并传递您的布局 id 和 peek height 用于第一次隐藏视图。

     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_
    android:layout_
    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_
    android:layout_
    android:background="@color/colorAccent"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
   />
</android.support.design.widget.CoordinatorLayout> 

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

【讨论】:

在 mBottomSheetBehavior = BottomSheetBehavior.from(views) 上抛出异常; java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.view.ViewGroup$LayoutParams android.view.View.getLayoutParams()” mBottomSheetBehavior = BottomSheetBehavior.from(views); 在创建的视图中使用【参考方案2】:

您可以为此使用底部对话框

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this); dialog.setContentView(YourView); dialog.show();

【讨论】:

它也像弹出窗口一样打开。它不像键盘那样显示

以上是关于如何在根布局底部设置 PopupWindow,如软键盘?的主要内容,如果未能解决你的问题,请参考以下文章

Android基础控件——PopupWindow模仿ios底部弹窗

请教popupwindow点击外部关闭问题

通用的popupwindow底部弹出框

动态设置 view 在布局中位置

PopupWindow底部弹出

PopupWindow设置底部,兼容7.0 与 在华为等带虚拟控制栏被遮挡