(Deprecated) Fragment onOptionsItemSelected not being called

后端 未结 9 2135
孤城傲影
孤城傲影 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;
    }
    
    0 讨论(0)
  • 2020-11-28 21:42

    I'm using actionbarsherlock. This worked for me:

    1) Create dummy_menu.xml menu

    <?xml version="1.0" encoding="utf-8"?>
    
    <menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" >
    <item
          android:title=""
          android:showAsAction="never"
          android:id="@+id/dummyMenu"
            />
    

    2) In activity inflate the menu like this:

    @Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
       inflater.inflate(R.menu.dummy_menu,menu);
       return super.onCreateOptionsMenu(menu);
    }
    

    3) In fragments onCreateView call setHasOptionsMenu(true) and override onCreateOptionsMenu and onOptionsItemSelected also hide the dummyMenu like this (in fragment)

        @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_actions, menu);
        MenuItem item = menu.findItem(R.id.dummyMenu);
        item.setVisible(false);
        super.onCreateOptionsMenu(menu, inflater);
    }
    

    Hope it helps someone.

    0 讨论(0)
  • 2020-11-28 21:46

    it's so simple you can do that in your fragment to make sure that your action will listen correctly:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }
    
    0 讨论(0)
提交回复
热议问题