(Deprecated) Fragment onOptionsItemSelected not being called

后端 未结 9 2144
孤城傲影
孤城傲影 2020-11-28 20:45

EDIT: This question was for the deprecated sherlock action bar. Android support library should be used instead now

I have added an action bar menu o

9条回答
  •  抹茶落季
    2020-11-28 21:40

    I had the same problem, but I think it's better to summarize and introduce the last step to get it working:

    1. Add setHasOptionsMenu(true) method in your Fragment's onCreate(Bundle savedInstanceState) method.

    2. Override onCreateOptionsMenu(Menu menu, MenuInflater inflater) (if you want to do something different in your Fragment's menu) and onOptionsItemSelected(MenuItem item) methods in your Fragment.

    3. Inside your Activity's onOptionsItemSelected(MenuItem item) method, make sure you return false when the menu item action would be implemented in Fragment's onOptionsItemSelected(MenuItem item) method.

    An example:

    Activity

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.activity_menu_item:
            // Do Activity menu item stuff here
            return true;
        case R.id.fragment_menu_item:
            // Not implemented here
            return false;
        default:
            break;
        }
    
        return false;
    }
    

    Fragment

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        ....
    }
    
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Do something that differs the Activity's menu here
        super.onCreateOptionsMenu(menu, inflater);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.activity_menu_item:
            // Not implemented here
            return false;
        case R.id.fragment_menu_item:
            // Do Fragment menu item stuff here
            return true;
        default:
            break;
        }
    
        return false;
    }
    

提交回复
热议问题