自定义弹出菜单 - 怎么做?
custom popup menu - how to?
首先,我是 android 开发的新手。
在我们今天的应用程序中,我们有一个选择颜色的按钮。单击红色按钮,会显示一个巨大的对话框,您可以在其中选择一种颜色。
我想改成这样:
颜色不仅是图标,而且是在 canvas 上以编程方式绘制的圆圈。
所以我的问题是,我怎样才能拥有比常规 menu/menu-items 更高级的弹出菜单。我应该从哪里开始寻找?是否可以使用片段?
可能 PopupMenu 是您需要的:
public void showPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.menu_example, popup.getMenu());
popup.show();
}
弹出菜单的布局:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/mail"
android:icon="@drawable/ic_mail"
android:title="@string/mail" />
<item android:id="@+id/upload"
android:icon="@drawable/ic_upload"
android:title="@string/upload"
android:showAsAction="ifRoom" />
<item android:id="@+id/share"
android:icon="@drawable/ic_share"
android:title="@string/share" />
</menu>
您可以将任何视图包含到 PopupWindow 元素中。在你的情况下,我可以推荐这个解决方案。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
popupButtonView.setOnClickListener {
val linearLayout = LinearLayout(applicationContext)
linearLayout.orientation = LinearLayout.VERTICAL
linearLayout.setBackgroundColor(Color.LTGRAY)
for (i in 0..5) {
linearLayout.addView(createTextView("Your text $i"))
}
PopupWindow(
linearLayout,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).showAsDropDown(popupButtonView)
//Use this line, if you want change gravity
//.showAtLocation(popupButtonView, Gravity.TOP, 0, 0)
}
}
private fun createTextView(tvText: String): TextView = TextView(applicationContext).apply {
gravity = Gravity.CENTER_VERTICAL
text = tvText
compoundDrawablePadding = DRAWABLE_PADDING
setPadding(TEXT_VIEW_PADDING)
setCompoundDrawablesWithIntrinsicBounds(getCircleShape(), null, null, null)
}
private fun getCircleShape(): ShapeDrawable = ShapeDrawable(OvalShape()).apply {
paint.color = getRandomColor()
intrinsicHeight = SHAPE_SIZE
intrinsicWidth = SHAPE_SIZE
}
private fun getRandomColor(): Int = Color.argb(255, Random.nextInt(256), Random.nextInt(256), Random.nextInt(256))
companion object {
const val TEXT_VIEW_PADDING = 20
const val DRAWABLE_PADDING = 20
const val SHAPE_SIZE = 50
}
}
首先,我是 android 开发的新手。
在我们今天的应用程序中,我们有一个选择颜色的按钮。单击红色按钮,会显示一个巨大的对话框,您可以在其中选择一种颜色。
我想改成这样:
颜色不仅是图标,而且是在 canvas 上以编程方式绘制的圆圈。
所以我的问题是,我怎样才能拥有比常规 menu/menu-items 更高级的弹出菜单。我应该从哪里开始寻找?是否可以使用片段?
可能 PopupMenu 是您需要的:
public void showPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.menu_example, popup.getMenu());
popup.show();
}
弹出菜单的布局:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/mail"
android:icon="@drawable/ic_mail"
android:title="@string/mail" />
<item android:id="@+id/upload"
android:icon="@drawable/ic_upload"
android:title="@string/upload"
android:showAsAction="ifRoom" />
<item android:id="@+id/share"
android:icon="@drawable/ic_share"
android:title="@string/share" />
</menu>
您可以将任何视图包含到 PopupWindow 元素中。在你的情况下,我可以推荐这个解决方案。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
popupButtonView.setOnClickListener {
val linearLayout = LinearLayout(applicationContext)
linearLayout.orientation = LinearLayout.VERTICAL
linearLayout.setBackgroundColor(Color.LTGRAY)
for (i in 0..5) {
linearLayout.addView(createTextView("Your text $i"))
}
PopupWindow(
linearLayout,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).showAsDropDown(popupButtonView)
//Use this line, if you want change gravity
//.showAtLocation(popupButtonView, Gravity.TOP, 0, 0)
}
}
private fun createTextView(tvText: String): TextView = TextView(applicationContext).apply {
gravity = Gravity.CENTER_VERTICAL
text = tvText
compoundDrawablePadding = DRAWABLE_PADDING
setPadding(TEXT_VIEW_PADDING)
setCompoundDrawablesWithIntrinsicBounds(getCircleShape(), null, null, null)
}
private fun getCircleShape(): ShapeDrawable = ShapeDrawable(OvalShape()).apply {
paint.color = getRandomColor()
intrinsicHeight = SHAPE_SIZE
intrinsicWidth = SHAPE_SIZE
}
private fun getRandomColor(): Int = Color.argb(255, Random.nextInt(256), Random.nextInt(256), Random.nextInt(256))
companion object {
const val TEXT_VIEW_PADDING = 20
const val DRAWABLE_PADDING = 20
const val SHAPE_SIZE = 50
}
}