web-dev-qa-db-ja.com

マージン付きのポップアップメニューを実装する

デフォルトのポップメニューを使用しており、同じ動作を期待しています。すべてが正常に動作しています。ポップアップメニューのレンダリングに関する私の懸念事項。ポップアップメニューが画面の右側に表示されます。

Android向けのYouTubeアプリで使用されている動作が必要です。 enter image description here

主に、ポップアップメニューに適切なマージンを提供できません。助けてください。重力をポップアップメニューに提供しようとしました。ただし、ポップアップメニューは画面の右側に固定されます。

PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT);
popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu());
16
Anchit Mittal

次の属性を使用して、PopupMenuの位置を変更できます:gravitydropDownHorizo​​ntalOffsetおよびdropDownVerticalOffset

最初に重力を重力に設定します。END

popup.setGravity(Gravity.END);

次に、スタイルを作成してドロップダウンオフセットを変更します

<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
    <item name="Android:dropDownHorizontalOffset">-4dp</item>
    <item name="Android:dropDownVerticalOffset">4dp</item>
</style>

アンカービューを重ねる場合は、

parent="@style/Widget.AppCompat.PopupMenu.Overflow"

最後にMyPopupMenuをテーマに適用します

<item name="popupMenuStyle">@style/MyPopupMenu</item>
37
Markus Rubey

これは少し遅れますが、これが誰かの役に立つことを願っています。

PopupMenuを使ってあなたがやっていることをしようとしていましたが、ListPopupWindowについて知るまで、何もうまくいきませんでした。それはより良い代替手段です。私の意見でははるかに柔軟であり、あなたが求めていたマージン間隔を達成することができます。

これがコードです:

_public class MainActivity extends AppCompatActivity
{
    private ImageButton mMoreOptionsButton;
    private ArrayAdapter<String> mPopupAdapter;
    private ArrayList<String> mOptionsArray = 
            new ArrayList<>(Arrays.asList("Option1", "Option2", "Option3"));
    private ListPopupWindow mPopupWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMoreOptionsButton = (ImageButton) view.findViewById(R.id.more_options_button);
        setupPopupWindow();
    }

    private void setupPopupWindow()
    {
        mPopupAdapter = new ArrayAdapter<>(MainActivity.this, Android.R.layout.simple_spinner_dropdown_item, mOptionsArray);
        mPopupWindow = new ListPopupWindow(MainActivity.this);
        mPopupWindow.setAdapter(mPopupAdapter);
        mPopupWindow.setAnchorView(mMoreOptionsButton);
        mPopupWindow.setWidth(500);
        mPopupWindow.setHorizontalOffset(-380); //<--this provides the margin you need
        //if you need a custom background color for the popup window, use this line:
        mPopupWindow.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(MainActivity.this, R.color.gray)));

        mPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                //do something with item by referring to it using the "position" parameter
            }
        });

        mMoreOptionsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                mPopupWindow.show();
            }
        });
    }
}
_

重要な部分はmPopupWindow.setHorizontalOffset()を呼び出すことです。この方法には注意が必要です。 mPopupWindow.setWidth()に設定した値に応じて、setHorizontalOffset()の値を適宜調整する必要があります。たまたま私のアプリでは、_-380_が最後から必要なマージンの完璧な量でした。したがって、この値を少し操作する必要があるかもしれません。

ポップアップウィンドウの上部にマージンが必要な場合は、setHeight()およびsetVerticalOffset()を使用しても同じことが言えると思います。

お役に立てれば :]

4
David Velasquez

特定の場所にpopUpWindowを設定できます

popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0);

public void showAtLocation(View parent, int gravity, int x, int y) {
        showAtLocation(parent.getWindowToken(), gravity, x, y);
    }

DropDownとして表示したい場合は、

public void showAsDropDown(View anchor, int xoff, int yoff) {
        showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
    }

PopupWindowのドキュメントをご覧ください http://developer.Android.com/intl/es/reference/Android/widget/PopupWindow.html

1
Anuj Sharma