Java 如何更改不同片段中的选项菜单?
我有一个菜单片段:Java 如何更改不同片段中的选项菜单?,java,android,android-fragments,android-actionbar,android-menu,Java,Android,Android Fragments,Android Actionbar,Android Menu,我有一个菜单片段: public class FragmentA extends Fragment { public FragmentA() { setHasOptionsMenu(true); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ...
public class FragmentA extends Fragment {
public FragmentA() {
setHasOptionsMenu(true);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.activity_main_actions, menu);
super.onCreateOptionsMenu(menu, inflater);
}
}
我想改变菜单,但它不工作,并保留旧的行动菜单
片段B与上面相同,具有不同的充气XML菜单
public class FragmentB extends Fragment {
public FragmentB() {
setHasOptionsMenu(true);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.**action_ranking**, menu);
super.onCreateOptionsMenu(menu, inflater);
}
}
编辑:
对于不同的片段使用不同的菜单布局,对于主活动和不同id使用1个菜单布局,在构造器中放置
设置选项菜单(true)
,并对特定片段菜单进行充气,这非常有用
public class FragmentA extends Fragment {
public FragmentA() {
setHasOptionsMenu(true);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragmenta_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
}
主活动中的菜单
public class MainActivity extends Activity {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
}
所有这些都可以通过片段完成-无需从活动中为菜单充气:
public class UpdateFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.update_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id){
case R.id.navUpdateProfile:
showToast("navUpdateProfile");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
如果有几个片段共享同一菜单,但有一些例外
class BaseFragment:Fragment(){
open var menuId = R.menu.default_menu
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true) // will apply to all children
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(menuId, menu) // will apply to all children except for overridden
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// all menu ids can be listed here unless specific to code in child
when (item.itemId) {
R.id.menu_option_1 -> {
// do something
}
R.id.menu_option_2 -> {
//do something
}
return false
}
}
class ChildFragment:BasFragment(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
menuId = R.menu.menu_2 // change to a different menu as desired here
}
}
在构造函数中放入
sethasOptions菜单(true)
。我有sethasOptions菜单(true);在onCreate片段中。你想在constructore里放什么?我没有看到你想要的菜单膨胀,主菜单需要在主活动中膨胀,特定于片段的菜单需要在片段中膨胀。感谢它的工作,我正在使用不同的菜单布局btwMine在添加行菜单后工作。清除();到片段的onCreateOptions菜单代码。请注意,也不必在构造函数中调用sethasOptions菜单(true)
。请参阅。请注意,片段中的onCreateOptionsMenu()
有第二个参数,即MenuInflater
,因此,如果您试图从活动复制/粘贴函数,将出现错误。