Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义弹出菜单-如何?_Android_Popup - Fatal编程技术网

Android 自定义弹出菜单-如何?

Android 自定义弹出菜单-如何?,android,popup,Android,Popup,首先,我是android开发新手 在我们今天的应用程序中,我们有一个选择颜色的按钮。单击红色按钮,将显示一个巨大的对话框,您可以在其中选择颜色。 我想换成这样: 颜色不仅仅是图标,而是在画布上通过编程绘制的圆圈 所以我的问题是,我怎么能有一个比常规菜单/菜单项更高级的弹出菜单呢。我应该从哪里开始寻找?可以使用片段吗?可能您需要的是弹出式菜单: public void showPopup(View v) { PopupMenu popup = new PopupMenu(this, v

首先,我是android开发新手

在我们今天的应用程序中,我们有一个选择颜色的按钮。单击红色按钮,将显示一个巨大的对话框,您可以在其中选择颜色。

我想换成这样:

颜色不仅仅是图标,而是在画布上通过编程绘制的圆圈


所以我的问题是,我怎么能有一个比常规菜单/菜单项更高级的弹出菜单呢。我应该从哪里开始寻找?可以使用片段吗?

可能您需要的是弹出式菜单:

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
}

}

这似乎是我想要做的,但我的按钮在底部,这个弹出窗口似乎显示在我的按钮下面,也就是说,几乎看不见。我试过玩重力(END,TOP,BOTTOM),但运气不好,你知道如何将它定位在按钮上方吗?@Viktorerikson,你可以使用。showAtLocation(PopubButtonView,gravity.TOP,0,0),我更新了我的主要评论。抱歉,这是我所说的常规菜单/菜单项。我希望在弹出菜单/窗口中有更多的编程自由