web-dev-qa-db-ja.com

Androidオーバーフローボタンのポップアップメニューの位置をどのように変更しますか?

Gmailアプリのポップアップメニューと同じものを、右上のオーバーフローボタンに固定して実装するのが好きです。そのために私はAndroid Androidポップアップメニュー のグーグルチュートリアルと同じコードを使用しましたが、私にとってはその下ではなくアクションバーのエッジの上にポップメニューを表示します。 gmailオーバーフローのポップメニューで、アクションバーのエッジでポップメニューが表示されることに注意してください。

これは私がポップアップメニューに使用したxmlです:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <item
        Android:id="@+id/item1"
        Android:title="lablab"/>
    <item
        Android:id="@+id/item2"
        Android:title="lablab"/>

</menu>

そして以下は私の活動です:

public void showFontSetting(View view) {
    PopupMenu popup = new PopupMenu(this, view);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.menu, popup.getMenu());
    popup.show();

    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
        // TODO Auto-generated method stub

            switch (item.getItemId()) {
                case R.id.item1:
                    Toast.makeText(Index.this,
                        "You Clicked : " + item.getTitle(),
                    Toast.LENGTH_SHORT).show();
                    break;
                case R.id.item2:
                    break;
            }
            return true;
        }
    });
}
8
user3266062

次のコードをアクティビティに追加します。

PopupWindow popupwindow_obj; // create object

popupwindow_obj=popupDisplay();  // initialize in onCreate()

popupwindow_obj.showAsDropDown(clickbtn,-40, 18); // where u want show on view click event

public PopupWindow popupDisplay() { // disply designing your popoup window
    final PopupWindow popupWindow = new PopupWindow(this); // inflet your layout or diynamic add view

    View view; 

    LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    view = inflater.inflate(R.layout.mylayout, null);

    Button item = (LinearLayout) 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;
}

res/layoutディレクトリにXMLを作成し、mylayout.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>
5
SuN

オーバーラップする場合のみ、次のアプローチを使用します。

PopupMenu popupMenu = new PopupMenu(getContext(), this, Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0);

明るい背景とオフセットの詳細な制御を備えたPopupMenuを取得するには、次のアプローチを使用します。

styles.xml

<style name="PopupMenuOverlapAnchor" parent="@style/Theme.AppCompat.Light">
   <item name="Android:overlapAnchor">true</item>
   <item name="Android:dropDownVerticalOffset">0dp</item>
   <item name="Android:dropDownHorizontalOffset">0dp</item>
</style>

コード:

ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getContext(), R.style.PopupMenuOverlapAnchor);
PopupMenu popupMenu = new PopupMenu(contextThemeWrapper, this);

もう動作しません: ここでは、PopupMenuの位置を調整する簡単な方法を示します。アクションバーのメニューのように、アンカービュー(overflowButton)の上にメニューを配置します。

    PopupMenu popupMenu = new PopupMenu(context, overflowMenuButton);
    popupMenu.inflate(R.menu.my_menu);

    // Fix vertical offset
    overflowMenuButton.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            popupMenu.show();
            if (popupMenu.getDragToOpenListener() instanceof ListPopupWindow.ForwardingListener)
            {
                ListPopupWindow.ForwardingListener listener = (ListPopupWindow.ForwardingListener) popupMenu.getDragToOpenListener();
                listener.getPopup().setVerticalOffset(-overflowMenuButton.getHeight());
                listener.getPopup().show();
            }
        }
    });
45
user1185087

私の場合、重力を適用することが役に立ちました

PopupMenu popup = new PopupMenu(this, v, Gravity.RIGHT);
5
Neeraj

私が見つけた各アプローチを試した後、特により柔軟なレイアウトを使用している場合は、アンカービューを配置する方が簡単で簡単な方法であると思います。 ConstraintLayout。

ポップアップメニューを固定する場所に非表示のビューを配置するだけです。

<View
    Android:id="@+id/anchor_menu"
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    Android:layout_marginTop="10dp"
    app:layout_constraintStart_toStartOf="@+id/button_menu"
    app:layout_constraintTop_toBottomOf="@+id/button_menu"
    />

次に、代わりにアンカービューとして使用します。

    mPopupMenu = new PopupMenu(getActivity(), mPopupMenuAnchor);

ブーム、それは行われます。

1
Stephen Liu
popupwindow.showAsDropDown(view,x,y);

ここでxおよびyはポップアップウィンドウの位置ですビューに対する

0
Sanket Kachhela