Comment remplacer android.support.v4.app.ActionBarDrawerToggle obsolète

127

Hier (17-10-2014), j'ai mis à jour le SDK Android et support-library-v4.jarde mon application, maintenant je reçois un avertissement de désapprobation lié à ActionBarDrawerToggle, la lecture de la documentation semble que je dois utiliser le ActionBarDrawerTogglein support-library-v7.appcompact.jar.

Voici quelques parties de mon activité qui pourraient être pertinentes:

import android.app.ActionBar;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class MyActivity extends FragmentActivity {
    private ActionBar bar;
    private CustomActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawer;
    private ListView mDrawerList;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_infoviewer);

        bar = this.getActionBar();

        bar.setDisplayHomeAsUpEnabled(true);

        bar.setHomeButtonEnabled(true);
        bar.setDisplayShowTitleEnabled(false);
        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        mDrawer.setBackgroundColor(getResources().getColor(R.color.White));
        initNavMenu();
        try {
            mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer);
        } catch (RuntimeException e) {
            e.printStackTrace();
        }

        mDrawer.setDrawerListener(mDrawerToggle);
    }

    ....

    private void initNavMenu() {
        NavMenuAdapter mAdapter = MyDrawers.getDefaultDrawer(MyActivity.this, true);
        mDrawerList = (ListView) findViewById(R.id.drawer);
        mDrawerList.setBackgroundColor(getResources().getColor(R.color.GreenMoneyDark));
        if (mDrawerList != null) mDrawerList.setAdapter(mAdapter);
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener(MyActivity.this, mDrawer, mDrawerList));
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle {

        public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.drawable.action_drawer,
                    R.string.ns_menu_open, R.string.ns_menu_close);
        }

        @Override
        public void onDrawerClosed(View view) {
            bar.setTitle(getString(R.string.ns_menu_close));
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            bar.setTitle(getString(R.string.ns_menu_open));
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    }

}

J'ai essayé de copier support-library-v7 et de remplacer

import android.support.v4.app.ActionBarDrawerToggle;

avec

 import android.support.v7.app.ActionBarDrawerToggle;

cela a causé un problème de compilation dans

 public CustomActionBarDrawerToggle(Activity mActivity,
                                               DrawerLayout mDrawerLayout) {
                super(mActivity, mDrawerLayout, R.drawable.action_drawer,
                        R.string.ns_menu_open, R.string.ns_menu_close);
            }

J'ai donc essayé de remplacer R.drawable.action_drawerpar

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout,new Toolbar(MyActivity.this) ,
                    R.string.ns_menu_open, R.string.ns_menu_close);
        }

cela compile mais plante au Runtime avec

 java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$attr;
            at android.support.v7.widget.Toolbar.<init>(Toolbar.java:190)
            at android.support.v7.widget.Toolbar.<init>(Toolbar.java:186)

Notez que android-support-v7-appcompat.jarest correctement ajouté dans les dépendances du projet entrez la description de l'image ici

AndreaF
la source
1
Changez votre importation de la v4 à la v7 et cela a fonctionné
Ahmed

Réponses:

66

Ajouter uniquement android-support-v7-appcompat.jaraux dépendances de la bibliothèque ne suffit pas, vous devez également importer dans votre projet le module que vous pouvez trouver dans votre SDK au chemin \android-sdk\extras\android\support\v7\appcompatet ensuite ajouter des dépendances de module en configurant la structure du projet de cette manière

entrez la description de l'image ici

sinon, seuls les fichiers de classe de la bibliothèque de support sont inclus et l'application n'est pas en mesure de charger les autres ressources à l'origine de l'erreur.

De plus, comme reVerse suggéré, remplacez

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout,new Toolbar(MyActivity.this) ,
                    R.string.ns_menu_open, R.string.ns_menu_close);
        }

avec

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
        }
Silverstorm
la source
Merci travaux! Cependant, le bouton bascule du tiroir devient sombre, comment changer la couleur?
AndreaF
mise à jour Le tiroir n'est pas affiché sur Jelly Bean et les versions précédentes
AndreaF
60

Vous n'avez pas besoin d'utiliser le super-appel du ActionBarDrawerTogglequi nécessite la barre d'outils . Cela signifie au lieu d'utiliser le constructeur suivant:

ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes)

Vous devriez utiliser celui-ci:

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

Donc, fondamentalement, la seule chose à faire est de supprimer votre coutume drawable:

super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);

En savoir plus sur le « nouveau » ActionBarDrawerToggle dans les Docs (clic) .

inverser
la source
J'ai essayé de suivre votre suggestion mais je plante avec ce problème:java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable; at android.support.v7.app.DrawerArrowDrawable.<init>(DrawerArrowDrawable.java:64) at android.support.v7.app.ActionBarDrawerToggle$DrawerArrowDrawableToggle.<init>(ActionBarDrawerToggle.java:469) at android.support.v7.app.ActionBarDrawerToggle.<init>(ActionBarDrawerToggle.java:222) at android.support.v7.app.ActionBarDrawerToggle.<init>(ActionBarDrawerToggle.java:150)
AndreaF
Vous utilisez Eclipse, non? Avez-vous vérifié les android-support-v7-appcompat.jarpropriétés de votre projet -> Chemin de construction Java -> Trier et exporter? De plus, il peut être utile de déplacer le v7-appcompat vers le haut.
revoir
J'utilise IntelliJ J'ai ajouté les android-support-v7-appcompat.jardépendances du projet de la même manière que support-v4 (sinon ne compile même pas)
AndreaF
1
Mhkay, malheureusement, je ne connais pas IntelliJ. Dans Android Studio, il vous suffit d'ajouter compile "com.android.support:appcompat-v7:21.0.0"à votre build.gradlefichier et vous êtes prêt à partir.
revoir
J'ai vérifié à plusieurs reprises si la dépendance de la bibliothèque est correctement configurée, il y a une autre raison qui cause le problème, j'ai pensé que la bibliothèque était peut-être corrompue mais j'ai essayé de la télécharger et de l'ajouter à nouveau à partir du gestionnaire de SDK sans résultat
AndreaF
27

Tu dois utiliser import android.support.v7.app.ActionBarDrawerToggle;

et utilisez le constructeur

public CustomActionBarDrawerToggle(Activity mActivity,DrawerLayout mDrawerLayout)
{
    super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
}

et si le bouton bascule du tiroir devient noir, vous devez utiliser le supportActionBar fourni dans la bibliothèque de support.

Vous pouvez implémenter supportActionbar à partir de ce lien: http://developer.android.com/training/basics/actionbar/setting-up.html

Abhi1227
la source
Merci, une importation manuelle de a import android.support.v7.app.ActionBarDrawerToggle;fonctionné pour moi. Même si j'ai généralement des importations automatiques, celle-ci n'a pas été importée automatiquement.
Azurespot
Et supprimerimport android.support.v4.app.ActionBarDrawerToggle;
VikingGlen
8

Au lieu de

drawer.setDrawerListener(toggle);

Vous pouvez utiliser

drawer.addDrawerListener(toggle);
Erluxman
la source