CardView 内的工具栏,用于创建弹出菜单(溢出图标)
Toolbar inside CardView to create a popup menu (overflow icon)
我有一个列表,看起来像 google 在 recyclerview 和 cardview 中播放,并且工作完美。
我需要添加一个弹出菜单(带有溢出图标),如下所示:
哪种方法最好?
我研究了一下,发现有两个选项:
1 - 在 cardview 布局中有一个工具栏。此解决方案是否存在性能问题?
2 - 带有溢出图标的图像按钮或图像视图,
当你点击菜单时创建。
我需要一个兼容 >= API 10
的解决方案
谢谢
这取决于你的布局。
如果您想要这样的布局,使用工具栏可以更轻松地实现它。
有点像
<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(......);
第 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_width="20dp"
android:layout_height="30dp"
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"/>
then give a icon from drawable
第 3 步:在支架内 class
and set item click listner inside 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;
}
}
我是这样做的:
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_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:layout_toStartOf="@+id/item"
android:layout_alignParentStart="true"/>
<ImageButton
android:layout_width="20dp"
android:layout_height="30dp"
android:id="@+id/options"
android:src="@drawable/ic_menu"
android:layout_alignParentEnd="true"
android:onClick="showOptions"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
popup_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();
}
我有一个列表,看起来像 google 在 recyclerview 和 cardview 中播放,并且工作完美。
我需要添加一个弹出菜单(带有溢出图标),如下所示:
哪种方法最好?
我研究了一下,发现有两个选项:
1 - 在 cardview 布局中有一个工具栏。此解决方案是否存在性能问题?
2 - 带有溢出图标的图像按钮或图像视图, 当你点击菜单时创建。
我需要一个兼容 >= API 10
的解决方案谢谢
这取决于你的布局。
如果您想要这样的布局,使用工具栏可以更轻松地实现它。
有点像
<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(......);
第 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_width="20dp"
android:layout_height="30dp"
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"/>
then give a icon from drawable
第 3 步:在支架内 class
and set item click listner inside 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;
}
}
我是这样做的:
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_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:layout_toStartOf="@+id/item"
android:layout_alignParentStart="true"/>
<ImageButton
android:layout_width="20dp"
android:layout_height="30dp"
android:id="@+id/options"
android:src="@drawable/ic_menu"
android:layout_alignParentEnd="true"
android:onClick="showOptions"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
popup_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();
}