【问题标题】:How change position of popup menu on android overflow button?如何在android溢出按钮上更改弹出菜单的位置?
【发布时间】:2014-05-07 11:13:03
【问题描述】:

我只是想在 Gmail 应用中实现与弹出菜单相同的功能,锚定在右上角的溢出按钮上。为此,我使用了与 android Android popup menu 的谷歌教程相同的代码,但对我来说,在操作栏边缘的顶部显示弹出菜单不在此之下。如果您注意到 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;
        }
    });
}

【问题讨论】:

  • 你检查过任何答案吗?
  • 是的,我正在我的代码中尝试答案。谢谢。

标签: android popup android-actionbar android-menu


【解决方案1】:

要仅重叠,请使用以下方法:

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.getDragToOpenListener() 对我来说是android.widget.PopupMenu 吗?
  • 我想你分析了调试输出并检测到这样的东西:mDragListener = {android.support.v7.widget.PopupMenu$1@7128}。仔细查看输出:@ 之前的最后两个符号是 1 和 $,这意味着该对象是一个内部匿名类实例。 PopupMenu 的真实实例如下所示:this = {android.support.v7.widget.PopupMenu@7123} 没有 $1。 PopupMenu 的源代码也揭示了这个事实: mDragListener = new ListPopupWindow.ForwardingListener(mAnchor) {...};
  • 这不起作用。也许过去有效,但不再有效。 ListPopupWindow 类不定义/声明 ForwardingListener。 ForwardingListener 位于 android.support.v7.widget 并且它的 listener.getPopup() 没有方法 setVerticalOffset()。
  • android:dropDownVerticalOffsetandroid:dropDownHorizontalOffset 不适合我,但明亮的背景可以。
  • @user1185087:请分享来自 R.attr.actionOverflowMenuStyle 的 actionOverflowMenuStyle
【解决方案2】:

在我的情况下应用重力有帮助

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

【讨论】:

【解决方案3】:

将以下代码添加到您的活动中:

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>

【讨论】:

  • 我是 android 新手,我进行了搜索,但找不到任何解决方案来让我的布局膨胀。
  • 查看视图; LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);视图 = inflater.inflate(R.layout.mylayout, null); RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);
  • 我应该在 inflate 上放什么而不是 mylayout。我有很多错误。
  • :) 你把你自己的布局。 xml文件
  • 你看到我添加代码的编辑了吗?对此我添加了您的代码并放入 view = inflater.inflate(R.menu.menu, null); RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item1);并将其调用到我的代码的 showFontSetting 方法。但我收到了很多例外。
【解决方案4】:

在尝试了我发现的每种方法后,我认为放置锚定视图可能仍然是一种更容易和更简单的方法,尤其是当您使用更灵活的布局时,例如约束布局。

只需在您希望弹出菜单锚定的位置放置一个不可见的视图:

<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);

砰,完成了。

【讨论】:

    【解决方案5】:

    也许您可以考虑改用 PopupWindow

    popupwindow.showAsDropDown(view,x,y);
    

    这里 xy 是弹出窗口的位置相对于您的视图

    【讨论】:

    • 这个问题是关于 PopupMenu,而不是 PopupWindow。
    • @mhenry 反对票被接受,但接受的答案也是使用弹出窗口的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多