Search code examples
androidactionbarsherlock

add a custom dropdown spinner to action item/overflow in Actionbar sherlock


I want get the effects like this picture. I am using Action bar Sherlock for backward compatibility.

enter image description here

I am use NAVIGATION_MODE_TABS mode in action bar. I follow this blog to achieve below screen. My code is here.

HomeActivity extends SherlockFragmentActivity

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    actionBar = getSupportActionBar();

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    // actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
    setTitle(R.string.app_name);

    mViewPager = (ViewPager) findViewById(R.id.pager);

    // Add the tabs
    mTabsAdapter = new TabsAdapter(this, actionBar, mViewPager);

    mTabsAdapter.addTab(actionBar.newTab().setText("General"),
            GeneralFragment.class, null);

    mTabsAdapter.addTab(actionBar.newTab().setText("Memory"),
            MemoryFragment.class, null);

    // more tabs here; seems no need those 

    if (savedInstanceState != null) {
        actionBar.setSelectedNavigationItem(savedInstanceState
                .getInt("tab"));
    }


    int titleId = Resources.getSystem().getIdentifier("action_bar_title",
            "id", "android");

    // If you're using sherlock, in older versions of android you are not
    // supposed to get a reference to android.R.id.action_bar_title, So
    // here's little hack for that.
    if (titleId == 0) {
        titleId = com.actionbarsherlock.R.id.abs__action_bar_title;
    }

    View titleView = findViewById(titleId);

    // attach listener to this spinnerView for handling spinner selection
    // change
    spinnerView = (Spinner) getLayoutInflater().inflate(
            R.layout.spinner_layout, null);
    //
    // source of ViewGroupUtils class is given at the end of this post.
    ViewGroupUtils.replaceView(titleView, spinnerView);

}

I manage to build this .enter image description here

How i build my desired screen in ActionbarSherlock? Any link or suggestion will be greatly appreciated .

Edited: My ViewGroupUtils class `public class ViewGroupUtils {

public static ViewGroup getParent(View view) {
    return (ViewGroup) view.getParent();
}

public static void removeView(View view) {
    ViewGroup parent = getParent(view);
    if (parent != null) {
        parent.removeView(view);
    }
}

public static void replaceView(View currentView, View newView) {

    ViewGroup parent = getParent(currentView);
    if (parent == null) {
        return;
    }
    final int index = parent.indexOfChild(currentView);
    removeView(currentView);
    removeView(newView);
    parent.addView(newView, index);
}

} `


Solution

  • Just change your menu XML with this

    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <item
        android:id="@+id/action_share"
        android:icon="@android:drawable/ic_menu_share"
        android:orderInCategory="100"
        android:showAsAction="ifRoom"
        android:title="Share"/>
    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        android:orderInCategory="100"
        android:showAsAction="ifRoom"
        android:title="Search"/>
    
    <item
        android:id="@+id/more"
        android:orderInCategory="100"
        android:icon="@android:drawable/ic_menu_more"
        android:showAsAction="always"
        android:title="">
        <menu>
            <item
                android:id="@+id/action_call"
                android:icon="@android:drawable/ic_menu_call"
                android:orderInCategory="100"
                android:showAsAction="never"
                android:title="Call"/>
            <item
                android:id="@+id/action_camera"
                android:icon="@android:drawable/ic_menu_camera"
                android:orderInCategory="100"
                android:showAsAction="never"
                android:title="Camera"/>
            <item
                android:id="@+id/action_compass"
                android:icon="@android:drawable/ic_menu_compass"
                android:orderInCategory="100"
                android:showAsAction="never"
                android:title="Compass"/>
            <item
                android:id="@+id/action_help"
                android:icon="@android:drawable/ic_menu_help"
                android:orderInCategory="100"
                android:showAsAction="never"
                android:title="Help"/>
        </menu>
    </item>
    

    No need to change in your Java file. Output is....

    enter image description here