Skip to content Skip to sidebar Skip to footer

Android: Navigationdrawer And Actionbarcompat

I started working with NavigationDrawer using ActionBarSherlock and got good results, but my company approving this Open Source is not likely to come anytime soon, so I'm working t

Solution 1:

NOTE: I'm too new to add more than one link in a post, etc., so am answering my own question instead of editing it (hope that's not against the rules?). Will edit the original once allowed.

Simple way to add Navigation Drawer with ActionBarCompat: I found that converting my existing app wasn't as bad as I thought it was going to be. Google's sample led me to believe Fragments were a necessity but that wasn't the case... far from it.

You can simply wrap your existing layouts with the DrawerLayout and plug in the ListView (or any layout containing the ListView for that matter) for the actual navigation. Then add the normal code to your existing Activity (extend ActionBarActivity) and build the navigation as you would have to anyway.

Here's some sample code with which to wrap your existing layout:

<?xml version="1.0" encoding="utf-8"?><android.support.v4.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent" >

[YOUR EXISTING LAYOUT GOES HERE]

    <ListViewandroid:id="@+id/left_drawer"android:layout_width="300dp"android:layout_height="match_parent"android:layout_gravity="start"android:background="#111"android:choiceMode="singleChoice"android:divider="@android:color/transparent"android:dividerHeight="0dp" /></android.support.v4.widget.DrawerLayout>

If you want to start with a sample app that does use fragments and go from there, here's my github repository based on the sample code: https://github.com/bcrider/NavigationDrawerActionBarCompat

Solution 2:

I converted my app from ActionBarSherlock to ActionBarCompat yesterday. I've had some problems, but nothing too serious.

I have some comments:

To update the themes, I just needed to override "Sherlock" to "AppCompat". For example, instead of inheriting from @style/Theme.Sherlock.Light.DarkActionBar, I'm inheriting from @style/Theme.AppCompat.Light.DarkActionBar.

For the action items, just update this way:

<menuxmlns:android="http://schemas.android.com/apk/res/android"xmlns:yourapp="http://schemas.android.com/apk/res-auto" ><itemandroid:id="@+id/action_search"android:icon="@drawable/ic_action_search"android:title="@string/action_search"yourapp:showAsAction="ifRoom"  />
    ...
</menu>

And in the onCreateOptionsMenu, use the normal MenuItem, but use static methods of MenuItemCompat to do ActionBar's stuff. For example: MenuItemCompat.expandActionView(searchMenuItem);

If you use RoboGuice inheriting from RoboSherlockActivity, you'll have trouble if you just copy it and change to ActionBarActivity. Here's my solution:

publicclassRoboActionBarActivityextendsActionBarActivityimplementsRoboContext {

    protectedEventManager eventManager;
    protectedHashMap<Key<?>, Object> scopedObjects = newHashMap<Key<?>, Object>();

    @InjectContentViewListener ignored; // BUG find a better place to put this@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
        final RoboInjector injector = RoboGuice.getInjector(this);
        eventManager = injector.getInstance(EventManager.class);
        injector.injectMembersWithoutViews(this);
        super.onCreate(savedInstanceState);
        eventManager.fire(newOnCreateEvent(savedInstanceState));
    }

    @OverridepublicvoidsetContentView(int layoutResID) {
        super.setContentView(layoutResID);
        contentViewChanged();
    }

    @OverridepublicvoidsetContentView(View view) {
        super.setContentView(view);
        contentViewChanged();
    }

    @OverridepublicvoidsetContentView(View view, ViewGroup.LayoutParams params) {
        super.setContentView(view, params);
        contentViewChanged();
    }

    @OverridepublicvoidaddContentView(View view, ViewGroup.LayoutParams params) {
        super.addContentView(view, params);
        contentViewChanged();
    }

    privatevoidcontentViewChanged() {
        RoboGuice.getInjector(this).injectViewMembers(this);
        eventManager.fire(newOnContentChangedEvent());
    }

    @OverrideprotectedvoidonRestart() {
        super.onRestart();
        eventManager.fire(newOnRestartEvent());
    }

    @OverrideprotectedvoidonStart() {
        super.onStart();
        eventManager.fire(newOnStartEvent());
    }

    @OverrideprotectedvoidonResume() {
        super.onResume();
        eventManager.fire(newOnResumeEvent());
    }

    @OverrideprotectedvoidonPause() {
        super.onPause();
        eventManager.fire(newOnPauseEvent());
    }

    @OverrideprotectedvoidonNewIntent( Intent intent ) {
        super.onNewIntent(intent);
        eventManager.fire(newOnNewIntentEvent());
    }

    @OverrideprotectedvoidonStop() {
        try {
            eventManager.fire(newOnStopEvent());
        } finally {
            super.onStop();
        }
    }

    @OverrideprotectedvoidonDestroy() {
        try {
            eventManager.fire(newOnDestroyEvent());
        } finally {
            try {
                RoboGuice.destroyInjector(this);
            } finally {
                super.onDestroy();
            }
        }
    }

    @OverridepublicvoidonConfigurationChanged(Configuration newConfig) {
        final Configuration currentConfig = getResources().getConfiguration();
        super.onConfigurationChanged(newConfig);
        eventManager.fire(newOnConfigurationChangedEvent(currentConfig, newConfig));
    }

    @OverridepublicvoidonContentChanged() {
        super.onContentChanged();
    }

    @OverrideprotectedvoidonActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        eventManager.fire(newOnActivityResultEvent(requestCode, resultCode, data));
    }

    @OverridepublicMap<Key<?>, Object> getScopedObjectMap() {
        return scopedObjects;
    }

}

Now, you start ActionMode with supportStartActionMode() and imports the ActionMode from the library's package.

To use the SearchView, you need to do something like this:

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto">

    <itemandroid:id="@+id/search"app:actionViewClass="android.support.v7.widget.SearchView"android:icon="@drawable/abc_ic_search"app:showAsAction="always|collapseActionView"android:title="@string/search"/>

</menu>

@OverridepublicbooleanonCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.search_menu, menu);

    searchMenuItem = menu.findItem(R.id.search);
    searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);

    if (searchView != null) {
        searchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = newSearchView.OnQueryTextListener() {
            publicbooleanonQueryTextChange(String newText) {
                returntrue;
            }

            publicbooleanonQueryTextSubmit(String query) {
                doSomething(query);
                returntrue;
            }
        };

        searchView.setOnQueryTextListener(queryTextListener);

    }

    returnsuper.onCreateOptionsMenu(menu);
}

The other things are working with no modification but the package of the imports.

You can see more information here: http://developer.android.com/guide/topics/ui/actionbar.html.

Solution 3:

The samples that come with the 4.3 sdk look promising, but I'm going to create a test project and try to convert my own application to ActionBarCompact and see if it functions better or worse than ActionBarSherlock! I'll update this post if I'm successful or not!

Solution 4:

While the provided example is good, I made another example which is a bit closer to the original Google Navigation Drawer example as it includes all original code (now aiming to support library) and formatting. Only some attributes had to be replaced with similar ones as they are only available from v11 onwards.

Download at: https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat

Note: This requires the v7 appcompat library to be present, see http://developer.android.com/tools/support-library/setup.html for details.

Post a Comment for "Android: Navigationdrawer And Actionbarcompat"