Всплывающее меню во фрагменте не появляется

Довольно новичок в Android, в настоящее время у меня возникают трудности с реализацией PopupMenu на моем ImageButton во фрагменте. В коде нет ошибок, эмулятор успешно собирается, но при нажатии на ImageButton всплывающее меню не появляется.

OneFragment.java

public class OneFragment extends Fragment {

public OneFragment() {
    // Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootview = inflater.inflate(R.layout.fragment_one, container,false);

    ImageButton popupButton = (ImageButton)rootview.findViewById(R.id.chineseTelevision);
    popupButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            PopupMenu popupMenu = new PopupMenu(getActivity().getApplicationContext(), v);
            popupMenu.inflate(R.menu.menu_main);
            popupMenu.show();
        }
    });

    return inflater.inflate(R.layout.fragment_one, container, false);
  }
}

После применения раствора Pavneet (это правильное решение)

return rootview;

Я наткнулся на другую ошибку,

android.view.InflateException: Binary XML file line #17: Failed to resolve attribute at index 6: TypedValue{t=0x3/d=0x486 "res/drawable/ic_menu_moreoverflow_material.xml" a=1 r=0x10803d6}

Я узнал, что эта ошибка была вызвана android.support.v7.widget.PopupMenu.

В этой ссылке есть решение, но нет объяснения, почему виджет вызвал проблему. Здесь Всплывающее меню в пользовательском ListView


person wuck    schedule 02.11.2016    source источник


Ответы (2)


вам нужно вернуть rootview вместо нового

return inflater.inflate(R.layout.fragment_one, container, false);

так и должно быть

return rootview;

return inflater.inflate(R.layout.fragment_one, container, false); создаст и вернет новое представление вместо того, которое вы создали, и, следовательно, в новом не будет никакого инициализированного объекта popupmenu внутри него.

поэтому ваш код будет

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootview = inflater.inflate(R.layout.fragment_one, container,false);

    ImageButton popupButton = (ImageButton)rootview.findViewById(R.id.chineseTelevision);

    popupButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

        PopupMenu popupMenu = new PopupMenu(getActivity().getApplicationContext(), v);
        popupMenu.inflate(R.menu.menu_main);
        popupMenu.show();

    }
  });
  return rootview;
}
person Pavneet_Singh    schedule 02.11.2016
comment
Спасибо за ваше объяснение, я больше понимаю, к какому виду вернуться сейчас. Код выполнялся без каких-либо ошибок, но при нажатии ImageButton у меня возникает эта ошибка. android.view.InflateException: Binary XML file line #17: Failed to resolve attribute at index 6: TypedValue{t=0x3/d=0x486 "res/drawable/ic_menu_moreoverflow_material.xml" a=1 r=0x10803d6} - person wuck; 02.11.2016
comment
это что-то с ресурсами, я попробовал ваш код и свое решение, и оно работает нормально, просто убедитесь, что ваши файлы theme и menu xml не имеют проблем, хотя мне кажется, что проблема theme, попробуйте очистить и запустить - person Pavneet_Singh; 03.11.2016
comment
После некоторого поиска в Google я обнаружил, что ошибка после вашего решения была связана с проблемой всплывающего виджета. Вот ссылка на случай, если у кого-то возникнет та же проблема, что и у меня. Я отметил ваши решения, спасибо, Павенит. - person wuck; 03.11.2016
comment
@wuck я очень рад, что ты это сделал, так держать :) - person Pavneet_Singh; 03.11.2016

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

person VITROXMAN    schedule 02.11.2016