Como substituir android.support.v4.app.ActionBarDrawerToggle obsoleto

127

Ontem (17-10-2014), atualizo o SDK do Android e support-library-v4.jardo meu aplicativo, agora recebo um aviso de descontinuação relacionado à ActionBarDrawerToggleleitura da documentação que parece ter que usar o ActionBarDrawerTogglein support-library-v7.appcompact.jar.

Aqui estão algumas partes da minha atividade que podem 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()
        }
    }

}

Eu tentei copiar support-library-v7 e substituir

import android.support.v4.app.ActionBarDrawerToggle;

com

 import android.support.v7.app.ActionBarDrawerToggle;

isso causou problemas de compilação em

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

Então, eu tentei substituir R.drawable.action_drawerpor

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

isso compila, mas trava no Runtime com

 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)

Observe que android-support-v7-appcompat.jarfoi adicionado corretamente nas dependências do projeto insira a descrição da imagem aqui

AndreaF
fonte
1
Mude sua importação de V4 a v7 e funcionou
Ahmed

Respostas:

66

Adicionar apenas android-support-v7-appcompat.jara dependências da biblioteca não é suficiente; você também precisa importar no seu projeto o módulo que pode encontrar no SDK no caminho \android-sdk\extras\android\support\v7\appcompate depois adicionar dependências do módulo, configurando a estrutura do projeto dessa maneira.

insira a descrição da imagem aqui

caso contrário, serão incluídos apenas os arquivos de classe da biblioteca de suporte e o aplicativo não poderá carregar os outros recursos que estão causando o erro.

Além disso, como sugerido pelo contrário, substitua este

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

com

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
        }
Silverstorm
fonte
Obrigado trabalha! No entanto, o botão de alternância da gaveta fica escuro, como pode mudar a cor?
AndreaF
atualização gaveta não é mostrado no Jelly Bean e versões anteriores
AndreaF
60

Não há necessidade de você usar uma chamada super ActionBarDrawerToggleque requer a Barra de Ferramentas . Isso significa que, em vez de usar o seguinte construtor:

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

Você deve usar este:

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

Então, basicamente, a única coisa que você precisa fazer é remover seu costume drawable:

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

Mais sobre o "novo" ActionBarDrawerToggle nos Documentos (clique) .

reverter
fonte
Tentei seguir sua sugestão, mas deixa de funcionar com esta questão: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
Você está usando o Eclipse, certo? Você verificou as android-support-v7-appcompat.jarpropriedades do seu projeto -> Caminho de Construção Java -> Solicitar e Exportar? Além disso, pode ser útil mover o v7-appcompat para o topo.
reverso
Eu uso Intellij eu ter adicionado o android-support-v7-appcompat.jarpara as dependências do projecto da mesma maneira do suporte-v4 (caso contrário doesn-t mesmo compilar)
AndreaF
1
Infelizmente, não estou familiarizado com o IntelliJ. No Android Studio, você só precisa adicionar compile "com.android.support:appcompat-v7:21.0.0"ao seu build.gradlearquivo e pronto.
reverso
Eu verifiquei várias vezes se a dependência da biblioteca está configurada corretamente, há algum outro motivo que causa o problema. Pensei que a biblioteca talvez
estivesse
27

você deve usar import android.support.v7.app.ActionBarDrawerToggle;

e use o construtor

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

e se o botão de alternância da gaveta ficar escuro, você deverá usar o supportActionBar fornecido na biblioteca de suporte.

Você pode implementar o supportActionbar neste link: http://developer.android.com/training/basics/actionbar/setting-up.html

Abhi1227
fonte
Obrigado, uma importação manual de import android.support.v7.app.ActionBarDrawerToggle;funcionou para mim. Mesmo que eu tenha importações automáticas normalmente, essa não foi importada automaticamente.
Azurespot 20/01/15
E excluir #import android.support.v4.app.ActionBarDrawerToggle;
VikingGlen
8

Instado de

drawer.setDrawerListener(toggle);

Você pode usar

drawer.addDrawerListener(toggle);
erluxman
fonte