我想在android中自定义
popupmenu
,默认弹出菜单提供了更多空间,所以我试图更改弹出菜单中的自定义布局,但我不知道如何操作。
注意:我想做这个小的弹出设计,所以我使用默认的弹出菜单,但我想自定义它。
findViewById(R.id.menuclick).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PopupMenu popupMenu = new PopupMenu(Sample1.this, view);
popupMenu.setOnMenuItemClickListener(Sample1.this);
popupMenu.inflate(R.layout.menus_layout);
popupMenu.show();
}
});
要通过按钮
popupMenu
膨胀 onClick
,请使用以下代码。
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(MainActivity.this, v);
popup.getMenuInflater().inflate(R.menu.pop_up, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this, "Some Text" + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
});
popup.show();//showing popup menu
}
});
编辑
要设置弹出菜单的样式,请添加以下样式。
<style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
<item name="android:popupBackground">#ffffff</item>
</style>
我注意到您还想在文本旁边添加图标。可以在弹出菜单中添加图标。然而,使用弹出窗口是更好的方法。这是示例代码:
PopupWindow mypopupWindow;
setPopUpWindow();
btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mypopupWindow.showAsDropDown(v,-153,0);
//showAsDropDown(below which view you want to show as dropdown,horizontal position, vertical position)
}
}
});
}
private void setPopUpWindow() {
LayoutInflater inflater = (LayoutInflater)
getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.popup, null);
Start=(RelativeLayout)view.findViewById(R.id.start_btn);
Pause=(RelativeLayout)view.findViewById(R.id.pause_btn);
Stop=(RelativeLayout)view.findViewById(R.id.stop_btn);
mypopupWindow = new PopupWindow(view,300, RelativeLayout.LayoutParams.WRAP_CONTENT, true);
弹出布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:background="@drawable/whitedrawable"
android:paddingRight="0dp"
android:layout_marginRight="0dp"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/startimg"
android:id="@+id/startimg"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
/>
<TextView
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="0dp"
android:text="Start"
android:layout_toRightOf="@+id/startimg"
/>
<!-- Continue for other items-->
whitedrawable
可用于设置您选择的背景。您可以使用 9patch 获得背景的阴影和圆角。
要关闭弹出窗口,请使用以下代码:
mypopupWindow.getContentView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mypopupWindow.dismiss();
}
});
要使用后退按钮关闭,请使用:
@Override
public void onBackPressed() {
if(mypopupWindow.isShowing()) {
mypopupWindow.dismiss();
return;
}
super.onBackPressed();
}
我的答案将类似于this答案(本文中的第一个答案)的更新,重点是使用Kotlin,也使用View Binding
PopupWindow
这段代码位于 Fragment 类中,这就是为什么我使用
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val bind = ViewBinding.inflate(inflater, container, false)
val popupInflater =
requireActivity().applicationContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflaterERVICE) as LayoutInflater
val popupBind = YourPopupLayoutBinding.inflate(popupInflater)
popupBind.icon1.setOnClickListener { // do your thing for 1st icon }
popupBind.icon2.setOnClickListener { // do your thing for 2nd icon }
val popupWindow = PopupWindow(
popupBind.root, 126.fromDpToPx.toInt(),
89.fromDpToPx.toInt(), true
).apply { contentView.setOnClickListener { dismiss() } }
// make sure you use number than wrap_content or match_parent,
// because for me it is not showing anything if I set it to wrap_content from ConstraintLayout.LayoutParams.
bind.yourButton.setOnClickListener(popupWindow::showAsDropDown)
return bind.root
}
来调用
applicationContext
这是布局代码,
requireActivity()
不要忘记在自定义布局中添加背景颜色,您也可以在自定义布局中自由设计样式。
希望对大家有帮助:)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="126dp"
android:layout_height="89dp"
android:background="#FFFFFF">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/icon1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawablePadding="8dp"
android:paddingHorizontal="10dp"
android:paddingVertical="10dp"
android:text="@string/tokopedia"
android:textColor="@color/dark_grey"
app:drawableStartCompat="@drawable/ic_icon1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/icon2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawablePadding="8dp"
android:paddingHorizontal="10dp"
android:paddingVertical="10dp"
android:text="@string/shopee"
android:textColor="@color/dark_grey"
app:drawableStartCompat="@drawable/ic_icon2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/icon1" />
</androidx.constraintlayout.widget.ConstraintLayout>
有以下构造函数
PopupMenu
当然,如果你想改变背景,你只需要定义一个设置该背景的样式资源,然后在第五个参数上引用它。将参数设置为零将使用 Android 的默认值。
示例样式:
public PopupMenu(@NonNull Context context, @NonNull View anchor, int gravity,
@AttrRes int popupStyleAttr, @StyleRes int popupStyleRes)
构造函数调用
<style name="popup_menu" parent="@android:style/Widget.PopupMenu">
<item name="android:popupBackground">@drawable/bg_card</item>
</style>