PopupMenu внутри адаптера getView() не работает

Я использую собственный адаптер и добавляю этот код в метод getView():

final ImageView popupMenu = (ImageView) v.findViewById(R.id.popupMenu);
    popupMenu.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            popupMenu.setImageResource(R.drawable.ic_popup_menu_selected);
            PopupMenu popup = new PopupMenu(context, view);
            popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu());
            popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
                @Override
                public void onDismiss(PopupMenu pm) {
                    popupMenu.setImageResource(R.drawable.ic_popup_menu);
                }
            });
            popup.show();
        }
});

Но я получаю эту ошибку: java.lang.RuntimeException: Failed to resolve attribute at index 6

Тот же самый код работает наListItemClick(), но не имеет смысла быть там, потому что его нужно щелкнуть один раз, чтобы настроить, и щелкнуть еще раз, чтобы вызвать PopupMenu.

Изменить: Logcat

11-02 17:58:51.276    1996-1996/com.android.example E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.android.example, PID: 1996
java.lang.RuntimeException: Failed to resolve attribute at index 6
        at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:603)
        at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:6423)
        at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:6591)
        at android.widget.FrameLayout$LayoutParams.<init>(FrameLayout.java:735)
        at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:679)
        at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:62)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
        at android.support.v7.internal.view.menu.MenuPopupHelper$MenuAdapter.getView(MenuPopupHelper.java:363)
        at android.support.v7.internal.view.menu.MenuPopupHelper.measureContentWidth(MenuPopupHelper.java:212)
        at android.support.v7.internal.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:146)
        at android.support.v7.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:118)
        at android.support.v7.widget.PopupMenu.show(PopupMenu.java:168)
        at com.android.example.GetAdapter$listAdapter$1.onClick(GetAdapter.java:81)
        at android.view.View.performClick(View.java:4756)
        at android.view.View$PerformClick.run(View.java:19749)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

person Shixons    schedule 02.11.2014    source источник
comment
Можете ли вы опубликовать ошибку logcat?   -  person Goran Horia Mihail    schedule 02.11.2014
comment
@GoranHoriaMihail готово.   -  person Shixons    schedule 03.11.2014
comment
GetAdapter.java:81 в этой строке произошел сбой. что на этой линии?   -  person Goran Horia Mihail    schedule 03.11.2014
comment
@GoranHoriaMihail popup.show();   -  person Shixons    schedule 03.11.2014
comment
да, это имеет смысл, вы хотите настроить событие в getview(), но показать всплывающее окно в onListItemClick(). теперь вы пытаетесь показать всплывающее окно в getview(), что неверно.   -  person Goran Horia Mihail    schedule 03.11.2014
comment
это решило проблему?   -  person Goran Horia Mihail    schedule 03.11.2014


Ответы (3)


При следующем импорте у меня всегда была ошибка:

import android.support.v7.widget.PopupMenu;

Он отлично работает со следующим импортом:

import android.widget.PopupMenu;

Полный ответ: stackoverflow.com/a/27826670/4548500

person SUPERCILEX    schedule 23.02.2016
comment
Хотя теоретически это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. . - person Bhargav Rao; 23.02.2016

Я решаю это так:

Добавьте это в адаптер getView():

ImageView popupMenu = (ImageView) v.findViewById(R.id.popupMenu); popupMenu.setTag(getItem(position)); popupMenu.setOnClickListener(MyFragment.popupMenuListener);

И это на MyFragment:

implements OnClickListener

popupMenuListener = this;

@Override public void onClick(final View view) { view.post(new Runnable() { @Override public void run() { showPopupMenu(view); } }); }

person Shixons    schedule 04.11.2014

Эта проблема связана с отсутствующими атрибутами темы.
Убедитесь, что тема вашего приложения расширяет Theme.AppCompat.

 <style name="AppTheme" parent="@style/Theme.AppCompat" />
person Amir Uval    schedule 28.03.2015