【问题标题】:How to set PopupWindow at bottom of root layout like soft keyboard?如何在根布局底部设置 PopupWindow,如软键盘?
【发布时间】: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 上。 我希望这个弹出窗口是打开的,并保持像带有动画的键盘一样。

【问题讨论】:

    标签: java android android-keypad android-popupwindow


    【解决方案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_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> 
    

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

    【讨论】:

    • 在 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();

    【讨论】:

    • 它也像弹出窗口一样打开。它不像键盘那样显示
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多