Cómo reemplazar android.support.v4.app.ActionBarDrawerToggle en desuso

127

Ayer (17-10-2014) he actualizado Android SDK y support-library-v4.jarde mi aplicación, ahora recibo una advertencia de desaprobación relacionada ActionBarDrawerToggle, al leer la documentación parece que tengo que usar el ActionBarDrawerTogglein support-library-v7.appcompact.jar.

Aquí algunas partes de mi actividad que podrían ser relevantes:

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

}

He intentado copiar support-library-v7 y reemplazar

import android.support.v4.app.ActionBarDrawerToggle;

con

 import android.support.v7.app.ActionBarDrawerToggle;

esto ha causado un problema de compilación en

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

Así que he tratado de reemplazar 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);
        }

esto se compila pero se bloquea en tiempo de ejecución 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)

Tenga en cuenta que android-support-v7-appcompat.jarse agrega correctamente en las dependencias del proyecto ingrese la descripción de la imagen aquí

AndreaF
fuente
1
Cambie su importación de v4 a v7 y funcionó
Ahmed

Respuestas:

66

Agregar solo android-support-v7-appcompat.jara las dependencias de la biblioteca no es suficiente, también debe importar en su proyecto el módulo que puede encontrar en su SDK en la ruta \android-sdk\extras\android\support\v7\appcompaty luego agregar las dependencias del módulo configurando la estructura del proyecto de esta manera

ingrese la descripción de la imagen aquí

de lo contrario, se incluyen solo los archivos de clase de la biblioteca de soporte y la aplicación no puede cargar los otros recursos que causan el error.

Además, como reVerse sugirió reemplazar esto

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);
        }
Tormenta de plata
fuente
Gracias trabaja! Sin embargo, el botón de alternancia del cajón se oscurece, ¿cómo puede cambiar el color?
AndreaF
El cajón de actualización no se muestra en Jelly Bean y versiones anteriores
AndreaF
60

No es necesario que utilice la súper llamada de la ActionBarDrawerToggleque requiere la barra Google . Esto significa en lugar de usar el siguiente constructor:

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

Deberías usar este:

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

Básicamente, lo único que tiene que hacer es eliminar su costumbre drawable:

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

Más información sobre el "nuevo" ActionBarDrawerToggle en los documentos (clic) .

contrarrestar
fuente
He tratado de seguir su sugerencia pero falla con este 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
Estás usando Eclipse ¿verdad? ¿Ha verificado las android-support-v7-appcompat.jarpropiedades de su proyecto -> Ruta de compilación de Java -> Ordenar y exportar? Además, puede ser útil mover v7-appcompat a la parte superior.
reVerse
Uso IntelliJ. He agregado el android-support-v7-appcompat.jara las dependencias del proyecto de la misma forma que support-v4 (de lo contrario, ni siquiera se compila)
AndreaF
1
Mhkay desafortunadamente no estoy familiarizado con IntelliJ. En Android Studio solo necesita agregar compile "com.android.support:appcompat-v7:21.0.0"a su build.gradlearchivo y listo.
reVerse
He comprobado muchas veces si la dependencia de la biblioteca está configurada correctamente, hay alguna otra razón que causa el problema, he pensado que la biblioteca puede estar dañada pero he intentado descargarla y agregarla nuevamente desde el administrador de SDK sin ningún resultado
AndreaF
27

debes usar import android.support.v7.app.ActionBarDrawerToggle;

y usar el constructor

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

y si el botón de alternancia del cajón se oscurece, debe usar la barra de acción de soporte proporcionada en la biblioteca de soporte.

Puede implementar supportActionbar desde este enlace: http://developer.android.com/training/basics/actionbar/setting-up.html

Abhi1227
fuente
Gracias, una importación manual de import android.support.v7.app.ActionBarDrawerToggle;funcionó para mí. Aunque generalmente tengo importaciones automáticas, esa no se importó automáticamente.
Azurespot
Y eliminarimport android.support.v4.app.ActionBarDrawerToggle;
VikingGlen
8

En lugar de

drawer.setDrawerListener(toggle);

Puedes usar

drawer.addDrawerListener(toggle);
erluxman
fuente