CardView 内的工具栏,用于创建弹出菜单(溢出图标)

Posted

技术标签:

【中文标题】CardView 内的工具栏,用于创建弹出菜单(溢出图标)【英文标题】:Toolbar inside CardView to create a popup menu (overflow icon) 【发布时间】:2016-04-11 00:32:12 【问题描述】:

我有一个看起来像 google play in a recyclerview with cardview 的列表,而且效果很好。

我需要添加一个弹出菜单(带有溢出图标),如下所示:

这是最好的方法?

我研究发现有2个选项:

1 - 在卡片视图布局内有一个工具栏。这个解决方案有性能问题吗?

2 - 使用带有溢出图标的 imagebutton 或 imageview, 当您单击菜单时会创建。

我需要一个与 >= API 10 兼容的解决方案

谢谢

【问题讨论】:

第二个。不需要整个工具栏,只需使用ImageButtonImageView 【参考方案1】:

第一步创建弹出菜单xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/Not_interasted_catugury"
        android:orderInCategory="100"
        android:title="Never show stories from this category  " />

    <item
        android:id="@+id/No_interasted"
        android:orderInCategory="101"
        android:title="Not Interested"></item>


</menu>

第 2 步:在您的卡片中制作一个图片按钮

 <ImageButton
            android:id="@+id/imageButton"
            android:layout_
            android:layout_
            android:src="@drawable/ic_dots"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:layout_below="@+id/item_detail"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:background="@null"/>

然后从drawable中给出一个图标

第 3 步:在 holder 类中

并在 onBindViewHolder 中设置项目点击列表

mImageButton= (ImageButton) view.findViewById(R.id.imageButton);
holder.mImageButton.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                showPopupMenu(holder.mImageButton,position);
            
        );

第 4 步:显示弹出菜单并扩展 xml

  private void showPopupMenu(View view,int position) 
        // inflate menu
        PopupMenu popup = new PopupMenu(view.getContext(),view );
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.popup_menu, popup.getMenu());
        popup.setOnMenuItemClickListener(new MyMenuItemClickListener(position));
        popup.show();
    

第 5 步:实现 OnMenuItemClickListener

     class MyMenuItemClickListener implements PopupMenu.OnMenuItemClickListener 

        private int position;
        public MyMenuItemClickListener(int positon) 
            this.position=positon;
        

        @Override
        public boolean onMenuItemClick(MenuItem menuItem) 
            switch (menuItem.getItemId()) 

                case R.id.Not_interasted_catugury:
                    String RemoveCategory=mDataSet.get(position).getCategory();
                    // mDataSet.remove(position);
                    //notifyItemRemoved(position);
                   // notifyItemRangeChanged(position,mDataSet.size());

                    mySharedPreferences.saveStringPrefs(Constants.REMOVE_CTAGURY,RemoveCategory,MainActivity.context);
                    Toast.makeText(MainActivity.context, "Add to favourite", Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.No_interasted:
                    mDataSet.remove(position);
                    notifyItemRemoved(position);
                    notifyItemRangeChanged(position,mDataSet.size());
                    Toast.makeText(MainActivity.context, "Done for now", Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.delete:
                    mySharedPreferences.deletePrefs(Constants.REMOVE_CTAGURY,MainActivity.context);
                default:
            
            return false;
        
    

【讨论】:

感谢您的帮助!很好的例子,组装得很好,节省了我的时间! 我建议使用android:background="?android:attr/selectableItemBackground"android:background="?attr/selectableItemBackground,因为它会在点击时显示效果。此外,如果您使用的是矢量可绘制对象,则应使用以下 app:srcCompat="@drawable/ic_more_vert_black_24dp" android:tint="@color/secondary_text" 以获得正确的外观。【参考方案2】:

这取决于你的布局。

如果您想要这样的布局,使用工具栏可以更轻松地实现它。

有点像

<android.support.v7.widget.CardView>

   <LinearLayout>

        <Toolbar  android:id="@+id/card_toolbar" />

        //......

   </LinearLayout>

</CardView>

toolbar.inflateMenu(R.menu.card_toolbar);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener()..);

如果您只想要一个弹出窗口,则使用图像更简单。 类似的东西:

PopupMenu popup = new PopupMenu(getContext(), mImageButton);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(......);

【讨论】:

我支持这个解决方案,我认为它应该很好用 图片按钮从何而来? 更方便的方式:popupMenu.inflate(R.menu.menu_restrictions_section); :)【参考方案3】:

我就是这样做的:

list_item:(分辨率/布局)

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_>

    <RelativeLayout
        android:layout_
        android:layout_>

        <TextView
            android:layout_
            android:layout_
            android:maxLines="1"
            android:layout_toStartOf="@+id/item"
            android:layout_alignParentStart="true"/>

        <ImageButton
            android:layout_
            android:layout_
            android:id="@+id/options"
            android:src="@drawable/ic_menu"
            android:layout_alignParentEnd="true"
            android:onClick="showOptions"/>    

    </RelativeLayout>

</androidx.cardview.widget.CardView>

popup_menu: ( res / menu )

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">>
    <item
        android:id="@+id/option1"
        android:title="Option1"/>

    <item
        android:id="@+id/option2"
        android:title="Option2"/>
</menu>

MainActivity:(在MainActivity的任意位置添加此函数)

public void showOptions(View view)
    PopupMenu popup = new PopupMenu(MainActivity.this, view);
    popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() 
        @Override
        public boolean onMenuItemClick(MenuItem item) 
            CardView view = 
           (CardView) ((ViewGroup) view.getParent()).getParent();
            int position = recyclerView.getChildAdapterPosition(cView);  
            Toast.makeText(getApplicationContext(), 
                        item.toString()+" clicked at position"+position,
                        Toast.LENGTH_SHORT).show();
            return true;
        
    );
    popup.show();

【讨论】:

以上是关于CardView 内的工具栏,用于创建弹出菜单(溢出图标)的主要内容,如果未能解决你的问题,请参考以下文章

CardView 内的布局重叠

CardView 内的 TabLayout

带圆角的 CardView 内的 ImageView 绘制不正确

MFC 工具栏中的弹出菜单

Android:LinearLayout 内的 CardView 使应用程序崩溃

NestedScrollViewLayout 内的 SwipeRefreshLayout 内的 RecyclerView 无法滚动