So, I wrote the code below a few years ago. First you need to make two classes: PopUp , and the second - TringleView .
PopUp: - Create a dialog box and open it in the immediate vicinity (where you want to open the dialog). You can change the color of the bg popup .
TringleView: - Make a tringle view or you can specify an arrow. You can change the color of the arrow bg .
View contentView = ((FragmentActivity)v.getContext()).getLayoutInflater().inflate(R.layout.edit_delete_layout,getAttachedRecyclerView(),false); // this view denote where you click or you want to open dialog near PopUp.showPopupOnView(((FragmentActivity) v.getContext()).getSupportFragmentManager(),contentView,view,false);
Popup.class
public class PopUp extends DialogFragment { protected int targetX; protected int targetY; protected int targetWidth; protected int targetHeight; protected Bitmap targetViewImage; protected View contentView; private SmartWorksPopUpViewHolder fragmentViewHolder; private static int bgDrawable = R.drawable.round_corner_white_bg; protected static int ONE_DIP; private static int arrowBgColor = R.color.border_color; private static int arrowWidthMultiple = 25; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (ONE_DIP == 0) { ONE_DIP = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 1, getResources() .getDisplayMetrics()); } setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Translucent); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { AbsoluteLayout parent = new AbsoluteLayout(getActivity()); parent.setId(R.id.parentLayout); return parent; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); this.fragmentViewHolder = createViewHolder(view); bindView(fragmentViewHolder); } protected SmartWorksPopUpViewHolder createViewHolder( View fragmentView) { return new SmartWorksPopUpViewHolder(fragmentView, contentView); } private void bindView(SmartWorksPopUpViewHolder vh) { if (fragmentViewHolder != null) { setupTargetDummyView(vh); boolean showOnTop = shouldShowOnTop(); setupArrow(vh, showOnTop); setupContent(vh, showOnTop); } } protected void setupContent(SmartWorksPopUpViewHolder vh, boolean showOnTop) { final int y; AbsoluteLayout.LayoutParams arrowParams = (android.widget.AbsoluteLayout.LayoutParams) vh.arrow .getLayoutParams(); int measureHeight = View.MeasureSpec.makeMeasureSpec( ViewGroup.LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED); int measureWidth = View.MeasureSpec.makeMeasureSpec( getActivity().getWindow().getDecorView().getWidth(), View.MeasureSpec.EXACTLY); vh.popupView.measure(measureWidth, measureHeight); if (showOnTop) { y = this.targetY - vh.popupView.getMeasuredHeight() + ONE_DIP; } else { y = arrowParams.y + arrowParams.height - ONE_DIP * 2; } updateAbsoluteLayoutParams( getActivity().getResources().getDimensionPixelOffset(R.dimen.sixty_dp), y, getActivity().getWindow().getDecorView().getWidth() - getActivity().getResources().getDimensionPixelOffset(R.dimen.seventy_dp), ViewGroup.LayoutParams.WRAP_CONTENT, vh.popupView); vh.parent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { exit(); } }); } private void setupArrow(SmartWorksPopUpViewHolder vh, boolean showOnTop) { final int arrowHeight = 15 * ONE_DIP; final int arrowWidth = arrowWidthMultiple * ONE_DIP; vh.arrow.setDirectionAndColor(showOnTop ? "down" : "top", vh.popupView.getContext().getResources().getColor(arrowBgColor)); final int x = (int) (targetX + targetWidth / 3 - arrowWidth / 2); final int y = targetY + (showOnTop ? -arrowHeight : targetHeight); updateAbsoluteLayoutParams(x, y, arrowWidth, arrowHeight, vh.arrow); } private void setupTargetDummyView(SmartWorksPopUpViewHolder vh) { vh.targetViewDummy.setImageBitmap(targetViewImage); updateAbsoluteLayoutParams(targetX, targetY, targetWidth, targetHeight, vh.targetViewDummy); } protected void updateAbsoluteLayoutParams(int x, int y, int width, int height, View view) { AbsoluteLayout.LayoutParams layoutParams = (android.widget.AbsoluteLayout.LayoutParams) view.getLayoutParams(); layoutParams.x = x; layoutParams.y = y; layoutParams.height = height; layoutParams.width = width; view.setLayoutParams(layoutParams); } private boolean shouldShowOnTop() { int windowHeight = getActivity().getWindow().getDecorView().getHeight(); int windowMid = windowHeight / 4; return targetY > windowMid; } @Override public void onDestroyView() { this.fragmentViewHolder = null; super.onDestroyView(); } protected static class SmartWorksPopUpViewHolder { protected AbsoluteLayout parent; protected View popupView; protected TringleView arrow; protected AppCompatImageView targetViewDummy; protected SmartWorksPopUpViewHolder(View fragmentView, View content) { this.parent = (AbsoluteLayout) fragmentView; final Context mContext = fragmentView.getContext(); this.popupView = content; this.arrow = new TringleView(mContext); this.targetViewDummy = new SmartWorksAppCompactImageView(mContext); this.parent.addView(popupView); this.parent.addView(arrow); this.parent.addView(targetViewDummy); this.parent.setBackgroundColor(0x00000000); content.setBackgroundResource(bgDrawable); } } public static PopUp showPopupOnView(FragmentManager fm, View contentView, View targetView, boolean showTargetView) { int[] location = new int[2]; targetView.getLocationInWindow(location); PopUp fragment = new PopUp(); fragment.targetX = location[0]; fragment.targetY = (int) (location[1] - TypedValue .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, targetView.getResources().getDisplayMetrics())); fragment.targetWidth = targetView.getMeasuredWidth(); fragment.targetHeight = targetView.getMeasuredHeight(); fragment.contentView = contentView; fragment.show(fm, "offer"); return fragment; } public void exit() { dismiss(); } public static void setArrowBackgroundColor(int color) { arrowBgColor = color; } public static void setArrowWidthMultiple(int arrowWidth) { arrowWidthMultiple = arrowWidth; } }
Tringleview.class
public class TringleView extends View { private String direction; private int color; public TringleView(Context context) { super(context); setDirectionAndColor("right", Color.RED); } public TringleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setDirectionAndColor(attrs.getAttributeValue(null, "direction"), Color.RED); } public TringleView(Context context, AttributeSet attrs) { super(context, attrs); setDirectionAndColor(attrs.getAttributeValue(null, "direction"), Color.RED); } public void setDirectionAndColor(String direction, int color) { if (direction != null && !direction.equals(this.direction) || this.color != color) { createTriangleDrawable(direction, color); } } private void createTriangleDrawable(String string, int color) { int width = MeasureSpec.makeMeasureSpec(30, MeasureSpec.UNSPECIFIED); int height = MeasureSpec.makeMeasureSpec(20, MeasureSpec.UNSPECIFIED); Path path = new Path(); if (string == null) { string = "right"; } if (string.equals("top")) { path.moveTo(0, height); path.lineTo(width / 2, 0); path.lineTo(width, height); } else if (string.equals("left")) { path.moveTo(width, 0); path.lineTo(0, height / 2); path.lineTo(width, height); } else if (string.equals("right")) { path.moveTo(0, 0); path.lineTo(width, height / 2); path.lineTo(0, height); } else if (string.equals("down")) { path.moveTo(0, 0); path.lineTo(width / 2, height); path.lineTo(width, 0); } path.close(); ShapeDrawable shapeDrawable = new ShapeDrawable(new PathShape(path, width, height)); shapeDrawable.getPaint().setColor(color); setBackground(shapeDrawable); this.color = color; this.direction = string; } }
edit_delete_layout.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView app:cardCornerRadius="@dimen/five_dp" android:layout_margin="@dimen/ten_dp" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" app:layout_behavior="android.support.design.widget.BottomSheetBehavior" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout app:layout_behavior="android.support.design.widget.BottomSheetBehavior" android:layout_width="match_parent" android:layout_height="wrap_content" android:weightSum="5" android:gravity="center" android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <sis.com.smartworks.widget.SmartWorksTextView android:id="@+id/share" android:textSize="@dimen/smallest_text_size" android:textColor="@color/black" android:visibility="visible" android:gravity="center" android:paddingRight="@dimen/four_dp" android:paddingLeft="@dimen/four_dp" android:paddingTop="@dimen/ten_dp" android:paddingBottom="@dimen/ten_dp" android:text="Share" android:layout_weight="1" android:textStyle="bold" android:layout_width="0dp" android:layout_height="wrap_content" /> <View android:layout_width="1dp" android:background="@color/grey_unselect" android:layout_height="match_parent" /> <sis.com.smartworks.widget.SmartWorksTextView android:id="@+id/reportSpam" android:textSize="@dimen/smallest_text_size" android:textColor="@color/black" android:visibility="visible" android:gravity="center" android:paddingRight="@dimen/four_dp" android:paddingLeft="@dimen/four_dp" android:paddingTop="@dimen/ten_dp" android:paddingBottom="@dimen/ten_dp" android:text="Spam" android:layout_weight="1" android:textStyle="bold" android:layout_width="0dp" android:layout_height="wrap_content" /> <View android:layout_width="1dp" android:background="@color/grey_unselect" android:layout_height="match_parent" /> <sis.com.smartworks.widget.SmartWorksTextView android:id="@+id/edit" android:textSize="@dimen/smallest_text_size" android:textColor="@color/black" android:gravity="center" android:paddingRight="@dimen/four_dp" android:paddingLeft="@dimen/four_dp" android:paddingTop="@dimen/ten_dp" android:paddingBottom="@dimen/ten_dp" app:swFontName="robotoNormal" android:layout_weight="1" android:text="@string/edit" android:textStyle="bold" android:layout_width="0dp" android:layout_height="wrap_content" /> <View android:layout_width="1dp" android:background="@color/grey_unselect" android:layout_height="match_parent" /> <sis.com.smartworks.widget.SmartWorksTextView android:id="@+id/delete" android:textSize="@dimen/smallest_text_size" android:textColor="@color/black" android:gravity="center" android:paddingRight="@dimen/four_dp" android:paddingLeft="@dimen/four_dp" android:paddingTop="@dimen/ten_dp" android:paddingBottom="@dimen/ten_dp" android:layout_weight="1" android:text="@string/delete" android:textStyle="bold" android:layout_width="0dp" android:layout_height="wrap_content" /> <View android:layout_width="1dp" android:background="@color/grey_unselect" android:layout_height="match_parent" /> <sis.com.smartworks.widget.SmartWorksTextView android:id="@+id/cancel" android:textSize="@dimen/smallest_text_size" android:textColor="@color/black" android:gravity="center" android:layout_weight="1" android:visibility="visible" android:paddingRight="@dimen/four_dp" android:paddingLeft="@dimen/four_dp" android:paddingTop="@dimen/ten_dp" android:paddingBottom="@dimen/ten_dp" android:textStyle="bold" android:text="@string/select_cancel" android:layout_width="0dp" android:layout_height="wrap_content" /> </LinearLayout> </android.support.v7.widget.CardView>
Result

So, if you want to make the view horizontal, you need to make the horizontal layout according to your requirement. So you can complete this task to change your edit_delete_layout.xml that you put in the contentView , then go to the Popup class method .
Note. - You can customize the popup class according to your requirement, and I know that this code has so much outdated representation that you can update yourself.