アクションバーのアクションボタンをクリックすると表示される PopupMen があります。私のPopupMenuで、次のようなカスタムレイアウトのMenuItemが必要です。
layout/menu_item_layout.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/menuItemLayout"
Android:orientation="horizontal" >
<ImageView
Android:id="@+id/imageViewMenuItem"
Android:layout_width="20dip"
Android:layout_height="20dip"
Android:src="@drawable/abc_list_focused_holo" />
<TextView
Android:id="@+id/textViewMenuItem"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="TextViewMenuItem" />
</LinearLayout>
これはPopUpMenuのxmlです。
menu/pop_menu.xml
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="apparound.actiobarpopupstylefacebook.Main" >
<item
Android:id="@+id/popupItem"
Android:showAsAction="ifRoom"/>
</menu>
私の活動コードでは次のとおりです:
public void showPopup(int idR){
View menuItemView = findViewById(idR);
PopupMenu popup = new PopupMenu(this, menuItemView);
MenuInflater inflate = popup.getMenuInflater();
inflate.inflate(R.menu.pop_menu, popup.getMenu());
MenuItem menuItem= popup.getMenu().findItem(R.id.popupItem);
menuItem.setActionView(R.layout.menu_item_layout);
popup.show();
}
しかし、ポップアップメニューが表示されると、アイテムは空です。 setActionview()メソッドを使用するのは間違っていましたか?ありがとう。
カスタムレイアウトの場合、メニューを使用できません。1つの代替オプションは PopupWindow です。
PopupWindow popupwindow_obj = popupDisplay();
popupwindow_obj.showAsDropDown(clickbtn, -40, 18); // where u want show on view click event popupwindow.showAsDropDown(view, x, y);
public PopupWindow popupDisplay()
{
final PopupWindow popupWindow = new PopupWindow(this);
// inflate your layout or dynamically add view
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.mylayout, null);
Button item = (Button) view.findViewById(R.id.button1);
popupWindow.setFocusable(true);
popupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setContentView(view);
return popupWindow;
}
My layout.xmlという名前のres/layoutフォルダーにこのXMLファイルを作成します
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal" >
<Button
Android:id="@+id/button1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Window test" />
</LinearLayout>
最終的なPopupWindow popupWindow = new PopupWindow(); //レイアウトを拡張するか、ビューを動的に追加しますLayoutInflater inflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);ビューを表示= inflater.inflate(R.layout.alert_reply_chat、null); popupWindow.setFocusable(true); popupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); popupWindow.setHeight(180); popupWindow.setBackgroundDrawable(null); popupWindow.setClippingEnabled(false); popupWindow.setTouchable(true); popupWindow.setContentView(view); popupWindowを返します。 //上記は私がチェックした作業コードです
デフォルトでは、PopupMenu(およびそのアイテム)のレイアウトはカスタマイズできません。以下のソリューションでは、水平レイアウトのPopupMenuを作成しました。この場合、クリック可能なアイテムとしてTextViewを使用しましたが、ボタンで簡単に置き換えることができます。メニュー項目は自由にカスタマイズできます。
1-カスタムPopupMenuクラス:
public class PopupMenuCustomLayout {
private PopupMenuCustomOnClickListener onClickListener;
private Context context;
private PopupWindow popupWindow;
private int rLayoutId;
private View popupView;
public PopupMenuCustomLayout(Context context, int rLayoutId, PopupMenuCustomOnClickListener onClickListener) {
this.context = context;
this.onClickListener = onClickListener;
this.rLayoutId = rLayoutId;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
popupView = inflater.inflate(rLayoutId, null);
int width = LinearLayout.LayoutParams.WRAP_CONTENT;
int height = LinearLayout.LayoutParams.WRAP_CONTENT;
boolean focusable = true;
popupWindow = new PopupWindow(popupView, width, height, focusable);
popupWindow.setElevation(10);
LinearLayout linearLayout = (LinearLayout) popupView;
for (int i = 0; i < linearLayout.getChildCount(); i++) {
View v = linearLayout.getChildAt(i);
v.setOnClickListener( v1 -> { onClickListener.onClick( v1.getId()); popupWindow.dismiss(); });
}
}
public void setAnimationStyle( int animationStyle) {
popupWindow.setAnimationStyle(animationStyle);
}
public void show() {
popupWindow.showAtLocation( popupView, Gravity.CENTER, 0, 0);
}
public void show( View anchorView, int gravity, int offsetX, int offsetY) {
popupWindow.showAsDropDown( anchorView, 0, -2 * (anchorView.getHeight()));
}
public interface PopupMenuCustomOnClickListener {
public void onClick(int menuItemId);
}
}
2-カスタムレイアウト。水平レイアウトのlinearlayout。この場合、TextViewアイテムで単純なLinearLayoutを使用します。ボタンなどを使用できます。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/white"
Android:orientation="horizontal">
<TextView
Android:id="@+id/popup_menu_custom_item_a"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="A"
Android:textAppearance="?android:textAppearanceMedium" />
<TextView
Android:id="@+id/popup_menu_custom_item_b"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginStart="10dp"
Android:text="B"
Android:textAppearance="?android:textAppearanceMedium" />
// ...
</LinearLayout>
3-通常のPopupMenuのようにカスタムPopupMenuを使用します。
PopupMenuCustomLayout popupMenu = new PopupMenuCustomLayout(
MainActivity.mainActivity, R.layout.popup_menu_custom_layout,
new PopupMenuCustomLayout.PopupMenuCustomOnClickListener() {
@Override
public void onClick(int itemId) {
// log statement: "Clicked on: " + itemId
switch (itemId) {
case R.id.popup_menu_custom_item_a:
// log statement: "Item A was clicked!"
break;
}
}
});
// Method 1: popupMenu.show();
// Method 2: via an anchor view:
popupMenu.show( anchorView, Gravity.CENTER, 0, 0);