Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add new option menu from child fragment of FragmentTabHost inside outer fragment

When I used some nested fragments for my application, child fragment of the application cannot add new option menu by overriding onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) method(never hit this method).

Class hierarchy of application is as follow.

MainActivity.java(extends SherlockFragmentActivity) (MainActivity include the following child fragments)

  1. Fragment1.java(extends SherlockFragment)

  2. Fragment2.java(extends SherlockFragment)

(Fragment2 include FragmentTabHost for adding following child fragments)

 i. ChildFragment1.java(extends SherlockFragment)

 ii. ChildFragment2.java(extends SherlockFragment)

 iii. ChildFragment3.java(extends SherlockFragment)

I can add new OptionMenu in Fragment1, Fragment2 by adding setHasOptionsMenu(true) in onCreate(Bundle savedInstanceState) and by overriding onCreateOptionsMenu(Menu menu, MenuInflater menuInflater)

But I cannot add new OptionMenu in ChildFragment1, ChildFragment2, ChildFragment3 because onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) method of child fragment classes are never called.

like image 681
Kyaw Min Thu L Avatar asked Dec 04 '25 12:12

Kyaw Min Thu L


1 Answers

Now I can call the onCreateOptionsMenu of child fragments and can also call onOptionsItemSelected by following code.

Fragment2.java

protected FragmentTabHost mTabHost;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
    super.onCreateOptionsMenu(menu, menuInflater);
    Fragment currentFragment = getChildFragmentManager().findFragmentByTag(mTabHost.getCurrentTabTag());
    if (currentFragment != null && currentFragment instanceof BaseTabsPagerChildFragment)
        ((BaseTabsPagerChildFragment) currentFragment).inflateOptionsMenu(menu, menuInflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (super.onOptionsItemSelected(item)) {
        return true;
    } else {
        Fragment currentFragment = getChildFragmentManager().findFragmentByTag(mTabHost.getCurrentTabTag());
        if (currentFragment != null && currentFragment instanceof BaseTabsPagerChildFragment) {
            return ((BaseTabsPagerChildFragment) currentFragment).onOptionsItemSelected(item);
        }
    }
    return false;
}

BaseTabsPagerChildFragment.java

abstract class BaseTabsPagerChildFragment extends BaseSherlockFragment {
    public abstract void inflateOptionsMenu(Menu menu, MenuInflater menuInflater);
}

ChildFragment1.java(extends BaseTabsPagerChildFragment.java)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
};

@Override
public void inflateOptionsMenu(Menu menu, MenuInflater menuInflater) {
    onCreateOptionsMenu(menu, menuInflater);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
    super.onCreateOptionsMenu(menu, menuInflater);
    menuInflater.inflate(R.menu.message_actionbar_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    boolean handled = super.onOptionsItemSelected(item);
    if (handled) {
        return true;
    }
    int itemId_ = item.getItemId();
    if (itemId_ == R.id.menu_item_compose) {
        launchCompose();
        return true;
    }
    if (itemId_ == R.id.menu_item_delete) {
        doDelete();
        return true;
    }
    return false;
}

Thanks.

like image 175
Kyaw Min Thu L Avatar answered Dec 06 '25 02:12

Kyaw Min Thu L



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!