Come sostituire android.support.v4.app.ActionBarDrawerToggle obsoleto


127

Ieri (17-10-2014) ho aggiornato Android SDK e support-library-v4.jardella mia app, ora ricevo un avviso di deprecazione relativo ActionBarDrawerToggle, leggendo la documentazione sembra che devo usare l' ActionBarDrawerTogglein support-library-v7.appcompact.jar.

Ecco alcune parti della mia attività che potrebbero essere rilevanti:

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

}

Ho provato a copiare support-library-v7 e sostituirlo

import android.support.v4.app.ActionBarDrawerToggle;

con

 import android.support.v7.app.ActionBarDrawerToggle;

questo ha causato problemi di compilazione in

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

Quindi ho provato a sostituirlo R.drawable.action_drawercon

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

questo viene compilato ma si arresta in modo anomalo in fase di runtime con

 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)

Si noti che android-support-v7-appcompat.jarviene aggiunto correttamente nelle dipendenze del progetto inserisci qui la descrizione dell'immagine


1
Cambia la tua importazione da v4 a v7 e ha funzionato
Ahmed il

Risposte:


66

L'aggiunta solo android-support-v7-appcompat.jaralle dipendenze delle librerie non è sufficiente, è inoltre necessario importare nel progetto il modulo che è possibile trovare nel proprio SDK nel percorso \android-sdk\extras\android\support\v7\appcompate successivamente aggiungere le dipendenze del modulo configurando la struttura del progetto in questo modo

inserisci qui la descrizione dell'immagine

in caso contrario sono inclusi solo i file di classe della libreria di supporto e l'app non è in grado di caricare le altre risorse che causano l'errore.

Inoltre, come suggerito da reVerse, sostituirlo

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

con

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

Grazie funziona! Tuttavia, il pulsante di attivazione / disattivazione del cassetto diventa scuro, come può cambiare il colore?
AndreaF,

aggiornamento del cassetto non è mostrato su Jelly Bean e versioni precedenti
AndreaF


60

Non è necessario che tu usi la super chiamata ActionBarDrawerToggleche richiede la barra degli strumenti . Ciò significa invece di utilizzare il seguente costruttore:

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

Dovresti usare questo:

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

Quindi sostanzialmente l'unica cosa che devi fare è rimuovere la tua abitudine drawable:

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

Ulteriori informazioni sul "nuovo" ActionBarDrawerToggle in Documenti (fare clic) .


Ho provato a seguire il tuo suggerimento, ma si blocca con questo problema: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,

Stai usando Eclipse giusto? Hai controllato android-support-v7-appcompat.jarnelle proprietà del tuo progetto -> Percorso build Java -> Ordina ed esporta? Inoltre, può essere utile spostare la v7 -compcompat in alto.
ribalta il

Uso IntelliJ Ho aggiunto le android-support-v7-appcompat.jardipendenze al progetto allo stesso modo di support-v4 (altrimenti non può nemmeno compilare)
AndreaF

1
Mhkay purtroppo non ho familiarità con IntelliJ. In Android Studio devi solo aggiungere il compile "com.android.support:appcompat-v7:21.0.0"tuo build.gradlefile e sei a posto.
ribalta il

Ho verificato molte volte se la dipendenza della libreria è configurata correttamente, ci sono altri motivi che causano il problema, ho pensato che la libreria potrebbe essere danneggiata ma ho provato a scaricare e aggiungerlo di nuovo dal gestore SDK senza risultato
AndreaF

27

devi usare import android.support.v7.app.ActionBarDrawerToggle;

e usa il costruttore

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

e se il pulsante di attivazione / disattivazione del cassetto diventa scuro, è necessario utilizzare la barra di supporto fornita nella libreria di supporto.

È possibile implementare supportActionbar da questo link: http://developer.android.com/training/basics/actionbar/setting-up.html


Grazie, un'importazione manuale di ha import android.support.v7.app.ActionBarDrawerToggle;funzionato per me. Anche se di solito ho importazioni automatiche, quella non è stata importata automaticamente.
Azurespot,

Ed eliminaimport android.support.v4.app.ActionBarDrawerToggle;
VikingGlen

8

Invece di

drawer.setDrawerListener(toggle);

Puoi usare

drawer.addDrawerListener(toggle);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.