How change position of popup menu on android overflow button?
Applying gravity helped in my case
PopupMenu popup = new PopupMenu(this, v, Gravity.RIGHT);
To overlap only, use this approach:
PopupMenu popupMenu = new PopupMenu(getContext(), this, Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0);
To get a PopupMenu with a bright background and a detailed control over the offsets use this approach:
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>
Code:
ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getContext(), R.style.PopupMenuOverlapAnchor);
PopupMenu popupMenu = new PopupMenu(contextThemeWrapper, this);
Add the following piece of code to your activity:
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;
}
Create an XML in res/layout
directory and name it 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>
After trying out each approach that I have found, I would think putting an anchoring view might still be an easier and simpler way, especially when you are using a more flexible layout, e.g. ConstraintLayout.
Just put an invisible view to where you want the popup menu to anchor:
<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"
/>
Then use it as the anchoring view instead:
mPopupMenu = new PopupMenu(getActivity(), mPopupMenuAnchor);
Boom, it is done.