web-dev-qa-db-ja.com

Android MenuItem Custom Layout

アクションバーのアクションボタンをクリックすると表示される 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()メソッドを使用するのは間違っていましたか?ありがとう。

17
bruno valenti

カスタムレイアウトの場合、メニューを使用できません。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>
27
SuN

最終的な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を返します。 //上記は私がチェックした作業コードです

0
jaigish

デフォルトでは、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);
0
tm1701