Jak zastąpić przestarzałe android.support.v4.app.ActionBarDrawerToggle

127

Wczoraj (17-10-2014) mam aktualizację Android SDK i support-library-v4.jarmojej aplikacji, teraz otrzymuję ostrzeżenie o wycofaniu ActionBarDrawerToggle, czytając dokumentację, wydaje mi się, że muszę użyć ActionBarDrawerTogglew support-library-v7.appcompact.jar.

Oto niektóre części mojej działalności, które mogą mieć znaczenie:

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

}

Próbowałem skopiować support-library-v7 i zamienić

import android.support.v4.app.ActionBarDrawerToggle;

z

 import android.support.v7.app.ActionBarDrawerToggle;

spowodowało to problem z kompilacją w

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

Więc starałem się wymienić R.drawable.action_drawerz

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

to kompiluje się, ale ulega awarii w czasie wykonywania z

 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)

Zauważ, że android-support-v7-appcompat.jarjest poprawnie dodany w zależnościach projektu wprowadź opis obrazu tutaj

AndreaF
źródło
1
Zmień import z v4 na v7 i zadziałało
Ahmed

Odpowiedzi:

66

Dodanie tylko android-support-v7-appcompat.jardo zależności bibliotecznych nie wystarczy, trzeba też zaimportować do projektu moduł, który znajdziesz w swoim SDK na ścieżce, \android-sdk\extras\android\support\v7\appcompata następnie dodać zależności modułów konfigurując w ten sposób strukturę projektu

wprowadź opis obrazu tutaj

w przeciwnym razie dołączane są tylko pliki klas biblioteki obsługi, a aplikacja nie jest w stanie załadować innych zasobów powodujących błąd.

Ponadto, jak zasugerował reVerse, zastąp to

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

z

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
        }
Silverstorm
źródło
Dziękuję działa! Jednak przycisk przełączania szuflady staje się ciemny, jak można zmienić kolor?
AndreaF,
aktualizacja Szuflada nie jest wyświetlana w Jelly Bean i poprzednich wersjach
AndreaF
60

Nie ma potrzeby korzystania z super-wywołania, ActionBarDrawerTogglektóre wymaga paska narzędzi Toolbar . Oznacza to, że zamiast używać następującego konstruktora:

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

Powinieneś użyć tego:

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

W zasadzie jedyne, co musisz zrobić, to usunąć swoje niestandardowe drawable:

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

Więcej informacji o „nowym” przełączniku ActionBarDrawerToggle w Dokumentach (kliknij) .

odwrócić
źródło
Próbowałem podążać za twoją sugestią, ale wywala się z tym problemem: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
Używasz Eclipse, prawda? Czy sprawdziłeś android-support-v7-appcompat.jarwe właściwościach projektu -> Ścieżka budowania Java -> Zamów i eksportuj? Ponadto pomocne może być przeniesienie v7-appcompat na górę.
reVerse
Używam IntelliJ Dodałem android-support-v7-appcompat.jardo zależności projektu w ten sam sposób jak support-v4 (inaczej nawet nie kompiluje)
AndreaF
1
Mhkay, niestety nie znam IntelliJ. W Android Studio wystarczy, że dodasz plik compile "com.android.support:appcompat-v7:21.0.0"do swojego build.gradlepliku i gotowe.
reVerse
Wielokrotnie sprawdzałem, czy zależność biblioteki jest poprawnie skonfigurowana, jest jakiś inny powód, który powoduje problem, myślałem, że biblioteka może być uszkodzona, ale próbowałem pobrać i dodać ją ponownie z menedżera SDK bez rezultatu
AndreaF
27

musisz użyć import android.support.v7.app.ActionBarDrawerToggle;

i użyj konstruktora

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

a jeśli przycisk przełączania szuflady stanie się ciemny, musisz użyć paska wsparciaActionBar dostarczonego w bibliotece wsparcia.

Możesz zaimplementować supportActionbar z tego linku: http://developer.android.com/training/basics/actionbar/setting-up.html

Abhi1227
źródło
Dzięki, ręczny import import android.support.v7.app.ActionBarDrawerToggle;zadziałał dla mnie. Mimo że zwykle mam automatyczny import, ten nie jest automatycznie importowany.
Azurespot
I usuńimport android.support.v4.app.ActionBarDrawerToggle;
VikingGlen
8

Zainteresowany

drawer.setDrawerListener(toggle);

Możesz użyć

drawer.addDrawerListener(toggle);
erluxman
źródło