Как установить значок справа в пользовательском всплывающем меню

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

menu_language.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <item
        android:id="@+id/nav_arabic"
        android:title="Arabic" />
    <item
        android:id="@+id/nav_southAfrica"
        android:icon="@drawable/ic_earphones"
        android:title="Afrikaans"
        />
    <item
        android:id="@+id/nav_albania"
        android:icon="@drawable/ic_earphones"
        android:title="Albanian " />
    <item
        android:id="@+id/nav_armenian"
        android:title="Armenian" />
    <item
        android:id="@+id/nav_azerbaijani"
        android:icon="@drawable/ic_earphones"
        android:title="Azerbaijani" />
    <item
        android:id="@+id/nav_bangla"
        android:icon="@drawable/ic_earphones"
        android:title="Bangla" />
    <item
        android:id="@+id/nav_basque"
        android:icon="@drawable/ic_earphones"
        android:title="Basque" />
    <item
        android:id="@+id/nav_belarusian"
        android:title="Belarusian" />

Язык.java:

 public void showMenu(View v) {
        PopupMenu popup = new PopupMenu(getActivity(), v);

        Object menuHelper;
        Class[] argTypes;
        try {
            Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
            fMenuHelper.setAccessible(true);
            menuHelper = fMenuHelper.get(popup);
            argTypes = new Class[]{boolean.class};
            menuHelper.getClass().getDeclaredMethod("setForceShowIcon", argTypes).invoke(menuHelper, true);
        } catch (Exception e) {

        }

        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.menu_language, popup.getMenu());
        popup.setOnMenuItemClickListener(this);

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


person Community    schedule 24.07.2018    source источник
comment
привет Мерфи! вы используете встроенный XML-файл меню, чтобы иметь всплывающее меню! который по умолчанию с menuIcon всегда находится в левом свойстве, поскольку они могут расширять метку справа в соответствии с размером экрана.   -  person Rizwan Atta    schedule 24.07.2018
comment
вот что вы можете сделать! вы можете просто иметь собственный файл макета, разработанный как ваш в папке макета для меню! и после этого вы получаете инфлятор меню и просите его обнулить старое меню и добавить туда свой собственный макет! ? хотите пример кода?   -  person Rizwan Atta    schedule 24.07.2018
comment
или просто contexrMenu, которое всплывает на longPress, имеет опции для вас, чтобы показать то, что вы хотите! но если вы настойчивы с optionMenu, вы должны пойти с моим решением   -  person Rizwan Atta    schedule 24.07.2018
comment
@Rizwanatta Спасибо, да. Будет понятнее, если вы поделитесь примером.   -  person    schedule 24.07.2018
comment
@Rizwanatta, не могли бы вы привести пример вашего решения?   -  person    schedule 24.07.2018
comment
см. medium.com/keepsafe-engineering/ , если это то, что вам нужно! хороший справочник для настройки ваших меню   -  person Rizwan Atta    schedule 24.07.2018
comment
@Rizwanatta это то, что я делаю прямо сейчас, но значок слева от заголовка, я хочу, чтобы значок был справа.   -  person    schedule 24.07.2018


Ответы (1)


Для пользовательских макетов вы не можете использовать меню. Альтернативным вариантом является PopupWindow. , который помогает вам отображать произвольное окно с вашими пользовательскими представлениями, которые вы можете стилизовать и использовать в качестве меню.

сделать что-то вроде этого

PopupWindow popupwindow_obj = popupDisplay();
popupwindow_obj.showAsDropDown(clickbtn, -40, 18); // where u want show on view click event popupwindow.showAsDropDown(view, x, y);

public PopupWindow popupDisplay() 
{ 

    final PopupWindow popupWindow = new PopupWindow(this);

    // inflate your layout or dynamically add view
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

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

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

создайте xml-файл, подобный этому

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/button1"
        drawableRight='@drawbale/icon'
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Window test" />
</LinearLayout>
person Rizwan Atta    schedule 24.07.2018
comment
зачем нужен xml файл? и где мне нужно раздуть мое меню? - person ; 24.07.2018
comment
вы не можете настроить файл меню, который уже создан! но то, что вы можете сделать, это просто создать вариант меню пользовательского дизайна, похожий на файл xml, и раздуть его! - person Rizwan Atta; 24.07.2018
comment
но у меня есть тысяча элементов, поэтому он будет очень большим xml - person ; 24.07.2018
comment
лучшим вариантом для этого было бы наличие popupOpened со счетчиком в нем! имеющие языковые названия и изображения! и вы можете заполнить это из своего массива строк из strings.xml или, возможно, с помощью java - person Rizwan Atta; 24.07.2018
comment
Да, но есть ли возможность, чтобы меню имело значок справа? человек только значок мы должны сместить, почему это так сложно. - person ; 24.07.2018
comment
к сожалению нет! это единственный способ, который я знаю или я прочитал весь документ, но там ничего нет, а также я думаю, что с точки зрения HCI это тоже неправильный подход! но способ, который я показал выше, может помочь - person Rizwan Atta; 24.07.2018