Today Google updated the AppCompat library to version 22.1.0, and we can now use AppCompatActivity
instead of ActionBarActivity
.
This means we no longer need to have a Toolbar
view in our activity layout.
The problem is that in order to create a Drawer toggle button, I cannot use new ActionBarDrawerToggle
anymore, because it expects a Toolbar
parameter, which will not exist.
How am I supposed to add the toggle button to the ActionBar now?
A possible solution
Activity:
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity
{
DrawerLayout drawerLayout;
ActionBarDrawerToggle toggle;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
toggle = new ActionBarDrawerToggle
(
this,
drawerLayout,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close
)
{
};
drawerLayout.setDrawerListener(toggle);
toggle.syncState();
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
if (toggle.onOptionsItemSelected(item))
{
return true;
}
return super.onOptionsItemSelected(item);
}
}
Layout:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ListView
android:id="@+id/list_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#f1f2f7"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent" />
</android.support.v4.widget.DrawerLayout>
Style :
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</style>
</resources>
It's important that your app inherit the AppCompat theme.
If you replaced the actionbar by a toolbar do not forget to put back the actionbar by removing this line in the styles.xml :
<item name="windowActionBar">false</item>
Gradle :
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:22.1.1'
compile 'com.android.support:appcompat-v7:22.1.1'
}
I put this code on github : https://github.com/bbouabou/AppCompatActivity-With-ActionBarDrawerToggle .
As per official docs, the ActionBarDrawerToggle
class from v7 features a toolbar-independent constructor:
public ActionBarDrawerToggle (Activity activity, DrawerLayout drawerLayout, int openDrawerContentDescRes, int closeDrawerContentDescRes)
This will work with the default ActionBar
provided through activity
. So, as always, either:
new ActionBarDrawerToggle(...)
;.NoActionBar
theme, instantiate/inflate a Toolbar
object, and call new ActionBarDrawerToggle(..., Toolbar t, ...)
Looks to me that nothing changed with the ActionBarActivity
refactoring.
If you're using Android Studio's default Navigation Drawer setup, then I found success by changing NavigationDrawerFragment.java
's ActionBarDrawerToggle
class from v4
to v7
in the import
statement and omitting the Toolbar
argument from the ActionBarDrawerToggle
constructor.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With