片段中的弹出菜单没有出现

Popup menu in fragment does not appear

我是 android 的新手,目前在 Fragment 中的 ImageButton 上实施 PopupMenu 时遇到了一些困难。代码中没有错误,模拟器能够成功构建,但是单击 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.

引起的

link 提供了解决方案,但没有解释小部件导致问题的原因。这里

你需要 return rootview 而不是新的

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

应该是

return rootview;

return inflater.inflate(R.layout.fragment_one, container, false); 将创建并 return 一个新视图,而不是您创建的视图,因此新视图内部不会有任何初始化的 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;
}

对于这个问题,实际上我建议你从 activity 管理 onclick,你可以创建一个允许通过 activity 传播的接口,更干净。