片段中的弹出菜单不会出现

时间:2016-11-02 16:13:56

标签: android menu fragment popupmenu android-imagebutton

对于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引起的。

此链接有解决方案,但没有解释小部件导致问题的原因。这里Popup Menu in custom ListView

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

对于这个问题,我实际上建议你从活动中管理onclick,你可以创建一个允许在活动中传播的界面,更清晰。