Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改不同片段中的选项菜单?_Java_Android_Android Fragments_Android Actionbar_Android Menu - Fatal编程技术网

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
,因此,如果您试图从活动复制/粘贴函数,将出现错误。