Всплывающее окно как в Play Store

Я хочу создать всплывающее меню, такое же, как в Play Store. Всплывающее меню должно открыться в правом нижнем углу элемента сетки. Но если элемент находится внизу экрана, всплывающее окно должно открываться над точкой, в которой он был нажат.

Я пробовал всплывающее меню, но оно открывается либо под, либо над элементом.

category_GV.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {

        System.out.println("position is : " + position);
        final MenuItems menuItems = (MenuItems)parent.getItemAtPosition(position);
        final String default_topping_link = menuItems.getLink();
        try{
            topping = DefaultToppingParser.parse(new FileInputStream(default_topping_link));
            for(int i=0;i<topping.size();i++){
                System.out.println("topping id  : " + topping.get(i));
            }
        }catch(Exception e){
            e.printStackTrace();
        }

        if(position == (burger_item_AL.size()-1)){
            Intent intent = new Intent(MainActivity.this,CustomiseItem.class);
            intent.putExtra("default_toppings_id", base_id);
            System.out.println("intent");
            startActivity(intent);
        } else {
            PopupMenu popupMenu = new PopupMenu(MainActivity.this, view);
            popupMenu.getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());
            popupMenu.show();

            popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {

                    ....some coding

                    return true;
                }
            });
        }
    }
});

Я просмотрел множество всплывающих меню в Google, но не смог найти такого же, как в Play Store. Может ли кто-нибудь предложить какое-то решение?

всплывающее окно:

В классе адаптера:

@Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    MainActivity.p = new Point();
                    MainActivity.p.x = (int) event.getRawX();
                    MainActivity.p.y = (int) event.getRawY();
                    if (MainActivity.p != null){
                            MainActivity.position = position;
                            MainActivity.showPopup(context, MainActivity.p);
                        }
                    return true;
                }
                return false;
            }
        });

Метод showpopup:

 public static void showPopup(final Context context, Point p) {
           int popupWidth = 150;
           int popupHeight = 150;

           // Inflate the popup_layout.xml
           LinearLayout viewGroup = (LinearLayout) ((Activity) context).findViewById(R.id.popup);
           LayoutInflater layoutInflater = (LayoutInflater) context
             .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           View layout = layoutInflater.inflate(R.layout.popup, viewGroup);

           // Creating the PopupWindow
           final PopupWindow popup = new PopupWindow(context);
           popup.setContentView(layout);
           popup.setWidth(popupWidth);
           popup.setHeight(popupHeight);
           popup.setFocusable(true);

           // Some offset to align the popup a bit to the right, and a bit down, relative to button's position.
           int OFFSET_X = 30;
           int OFFSET_Y = 30;

           // Clear the default translucent background
           popup.setBackgroundDrawable(new BitmapDrawable());

           // Displaying the popup at the specified location, + offsets.
           System.out.println("showing popup");
           popup.showAtLocation(layout, Gravity.NO_GRAVITY, p.x - OFFSET_X, p.y + OFFSET_Y);
           }

person megha    schedule 30.07.2014    source источник
comment
Вместо этого используйте PopupWindow. Это даст вам больше контроля над позиционированием и содержанием.   -  person Mike M.    schedule 30.07.2014
comment
я пытался использовать всплывающее окно, но я не могу изменить положение всплывающего окна в зависимости от положения элемента   -  person megha    schedule 30.07.2014
comment
если элемент находится справа от самого элемента, всплывающее окно должно появиться поверх точки, по которой щелкнули. Но я не могу получить это   -  person megha    schedule 30.07.2014
comment
используйте showAtLocation (View viewinActivity, гравитационный режим гравитации, int xOffset, int yOffset):   -  person pskink    schedule 30.07.2014
comment
Я разместил свой код со всплывающим окном. Но это не то же самое, что Play Store.   -  person megha    schedule 30.07.2014
comment
во всплывающем окне я использовал showAtLocation().   -  person megha    schedule 30.07.2014
comment
showAtLocation(), бесполезно, если я нажимаю на элементы, которые выровнены по нижней части экрана или справа от screen.menu указывает на какой-то другой элемент   -  person megha    schedule 30.07.2014
comment
вы можете использовать различные режимы гравитации Gravity   -  person pskink    schedule 30.07.2014


Ответы (2)


Вы должны использовать PopupWindow для имитации интересующего вас поведения.

По этой ссылке вы можете найти интересный туториал, который учит, как этого добиться. http://mrbool.com/how-to-implement-popup-window-in-android/28285

Надеюсь, поможет.

person AlexBalo    schedule 30.07.2014

main.xml

<?xml version="1.0" encoding="utf-8"?>

<item
    android:id="@+id/spam"
    android:title="Spam"/>
<item
    android:id="@+id/blockuser"
    android:title="Block User"/>
<item
    android:id="@+id/remove"
    android:title="Remove"/>

код всплывающего меню

PopupMenu popup = new PopupMenu(activity, v);

            /** Adding menu items to the popumenu */
            popup.getMenuInflater().inflate(R.menu.main, popup.getMenu());
            popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {

                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    // TODO Auto-generated method stub
                    switch (item.getItemId()) {
                    case R.id.spam:

                        Toast.makeText(activity, "Spam clicked",
                                Toast.LENGTH_SHORT).show();
                        break;

                    case R.id.blockuser:
                        Toast.makeText(activity, " Block user clicked",
                                Toast.LENGTH_SHORT).show();
                        break;

                    case R.id.remove:
                        Toast.makeText(activity, "Remove clicked",
                                Toast.LENGTH_SHORT).show();

                        // RecentFragment rf = new RecentFragment();
                        // rf.onItemClick(position);
                        break;

                    default:
                        break;
                    }

                    return false;
                }
            });
            popup.show();

этот код работает для меня отлично, и мое требование такое же, как вы упомянули в своем описании, надеюсь, это поможет вам

person Android is everything for me    schedule 30.07.2014
comment
проверьте мой первый код. Я пробовал всплывающее меню. Он отображает меню либо внизу, либо сверху. Но я хочу, чтобы меню было внизу справа или если щелкнуть правой кнопкой мыши по самому элементу, оно должно быть выровнено по основанию, но открываться по направлению к центру экрана. - person megha; 30.07.2014
comment
о, на самом деле всплывающее меню показывает свое меню в соответствии с ROOM (пробелом), доступным для его меню, я надеюсь, что это может помочь вам в любом случае, попробуйте Google, вы можете получить свой ответ, счастливое кодирование - person Android is everything for me; 30.07.2014
comment
я искал в гугле, но не нашел решения - person megha; 30.07.2014