对于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
答案 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,你可以创建一个允许在活动中传播的界面,更清晰。