web-dev-qa-db-fra.com

nouveau ActionBarDrawerToggle lors de l'utilisation d'AppCompatActivity

Aujourd'hui, Google a mis à jour la bibliothèque AppCompat vers la version 22.1.0, et nous pouvons maintenant utiliser AppCompatActivity au lieu de ActionBarActivity. Cela signifie que nous n'avons plus besoin d'avoir une vue Toolbar dans notre structure d'activité.

Le problème est que pour créer un bouton bascule de tiroir, je ne peux pas utiliser new ActionBarDrawerToggle plus, car il attend un paramètre Toolbar, qui n'existera pas.

Comment suis-je censé ajouter le bouton bascule à l'ActionBar maintenant?

16
Guilherme

Une solution possible

Activité:

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);
    }
}

Disposition:

<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>

Il est important que votre application hérite du thème AppCompat.

Si vous avez remplacé la barre d'actions par une barre d'outils n'oubliez pas de remettre la barre d'actions en supprimant cette ligne dans le 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'
}

J'ai mis ce code sur github: https://github.com/bbouabou/AppCompatActivity-With-ActionBarDrawerToggle .

22
Brahim Bouaboud

Selon documents officiels , la classe ActionBarDrawerToggle de la v7 dispose d'un constructeur indépendant de la barre d'outils:

public ActionBarDrawerToggle (Activity activity, DrawerLayout drawerLayout, int openDrawerContentDescRes, int closeDrawerContentDescRes)

Cela fonctionnera avec la valeur par défaut ActionBar fournie par activity. Donc, comme toujours, soit:

  1. vous héritez d'un thème de barre d'action et appelez new ActionBarDrawerToggle(...);
  2. vous héritez d'un thème .NoActionBar, instanciez/gonflez un objet Toolbar et appelez new ActionBarDrawerToggle(..., Toolbar t, ...)

Il me semble que rien n'a changé avec le refactoring ActionBarActivity.

5
natario

Si vous utilisez Android Configuration par défaut du tiroir de navigation de Studio, j'ai trouvé le succès en modifiant NavigationDrawerFragment.Java's ActionBarDrawerToggle classe de v4 à v7 dans l'instruction import et en omettant l'argument Toolbar du constructeur ActionBarDrawerToggle.

4
SQLiteNoob