如何将自定义布局传递给 PopupMenu?

问题描述 投票:0回答:3

我想在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();
    }
});
android popupmenu
3个回答
46
投票

要通过按钮

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();
}

2
投票

我的答案将类似于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()

不要忘记在自定义布局中添加背景颜色,您也可以在自定义布局中自由设计样式。

希望对大家有帮助:)


0
投票
<?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>

© www.soinside.com 2019 - 2024. All rights reserved.