web-dev-qa-db-fra.com

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

Hier (17-10-2014), j'ai la mise à jour Android SDK et le support-library-v4.jar de mon application. Je reçois maintenant un avertissement de dépréciation lié à ActionBarDrawerToggle, en lecture la documentation semble indiquer que je dois utiliser le ActionBarDrawerToggle dans 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 posé 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_drawer par

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.jar est correctement ajouté aux dépendances du projet. enter image description here

126
AndreaF

Ajouter uniquement Android-support-v7-appcompat.jar aux 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 à l’aide du chemin \Android-sdk\extras\Android\support\v7\appcompat puis ajouter des dépendances de module dans la structure du projet. façon

enter image description here

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

En outre, comme réversé suggéré de remplacer cette

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

Vous n'avez pas besoin d'utiliser le super-appel de la ActionBarDrawerToggle qui nécessite le 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 drawable personnalisé:

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

En savoir plus sur le "nouveau" ActionBarDrawerToggle dans la documentation (clic) .

60
reVerse

vous devez utiliser import Android.support.v7.app.ActionBarDrawerToggle;

et utiliser 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 sombre, 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

27
Abhi1227

Au lieu de

drawer.setDrawerListener(toggle);

Vous pouvez utiliser

drawer.addDrawerListener(toggle);
6
erluxman