如何在根布局底部设置 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,如软键盘?的主要内容,如果未能解决你的问题,请参考以下文章