So ersetzen Sie veraltete android.support.v4.app.ActionBarDrawerToggle

127

Gestern (17-10-2014) habe ich das Android SDK und support-library-v4.jarmeine App aktualisiert. Jetzt erhalte ich eine Warnung bezüglich der Ablehnung. Das ActionBarDrawerToggleLesen der Dokumentation scheint, dass ich das ActionBarDrawerTogglein verwenden muss support-library-v7.appcompact.jar.

Hier einige Teile meiner Aktivität, die relevant sein könnten:

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

}

Ich habe versucht, support-library-v7 zu kopieren und zu ersetzen

import android.support.v4.app.ActionBarDrawerToggle;

mit

 import android.support.v7.app.ActionBarDrawerToggle;

Dies hat zu Kompilierungsproblemen in geführt

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

Also habe ich versucht , zu ersetzen , R.drawable.action_drawermit

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

Dies wird kompiliert, stürzt aber zur Laufzeit mit ab

 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)

Beachten Sie, dass dies android-support-v7-appcompat.jarin Projektabhängigkeiten korrekt hinzugefügt wird Geben Sie hier die Bildbeschreibung ein

AndreaF
quelle
1
Ändern Sie Ihren Import von v4 auf v7 und es hat funktioniert
Ahmed

Antworten:

66

Das Hinzufügen nur android-support-v7-appcompat.jarzu Bibliotheksabhängigkeiten reicht nicht aus. Sie müssen auch das Modul, das Sie in Ihrem SDK unter dem Pfad finden, in Ihr Projekt importieren \android-sdk\extras\android\support\v7\appcompatund anschließend Modulabhängigkeiten hinzufügen, um die Projektstruktur auf diese Weise zu konfigurieren

Geben Sie hier die Bildbeschreibung ein

Andernfalls sind nur die Klassendateien der Support-Bibliothek enthalten, und die App kann die anderen Ressourcen, die den Fehler verursachen, nicht laden.

Zusätzlich, wie von reVerse vorgeschlagen, ersetzen Sie dies

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

mit

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
        }
Silbersturm
quelle
Danke funktioniert! Der Umschaltknopf der Schublade wird jedoch dunkel. Wie kann die Farbe geändert werden?
AndreaF
Update Drawer wird nicht auf Jelly Bean und früheren Versionen
angezeigt
60

Sie müssen keinen Super-Call von verwenden, für den ActionBarDrawerToggledie Symbolleiste erforderlich ist . Dies bedeutet, anstatt den folgenden Konstruktor zu verwenden:

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

Sie sollten dieses verwenden:

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

Das einzige, was Sie tun müssen, ist, Ihre Gewohnheit zu entfernen drawable:

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

Mehr zum "neuen" ActionBarDrawerToggle in den Dokumenten (klicken) .

umkehren
quelle
Ich habe versucht, Ihrem Vorschlag zu folgen, stürzt aber mit diesem Problem ab: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
Sie verwenden Eclipse richtig? Haben Sie android-support-v7-appcompat.jarin Ihren Projekteigenschaften -> Java Build Path -> Order and Export überprüft ? Außerdem kann es hilfreich sein, den v7-appcompat nach oben zu verschieben.
ReVerse
Ich benutze IntelliJ Ich habe die android-support-v7-appcompat.jarzu den Projektabhängigkeiten auf die gleiche Weise wie support-v4 hinzugefügt (sonst wird nicht einmal kompiliert)
AndreaF
1
Mhkay, ich kenne IntelliJ leider nicht. In Android Studio müssen Sie nur noch compile "com.android.support:appcompat-v7:21.0.0"zu Ihrer build.gradleDatei hinzufügen , und schon kann es losgehen.
ReVerse
Ich habe viele Male überprüft, ob die Bibliotheksabhängigkeit korrekt konfiguriert ist. Es gibt einen anderen Grund, der das Problem verursacht. Ich habe gedacht, dass die Bibliothek möglicherweise beschädigt ist, aber ich habe versucht, sie vom SDK-Manager herunterzuladen und erneut hinzuzufügen, ohne Ergebnis
AndreaF
27

Sie müssen verwenden import android.support.v7.app.ActionBarDrawerToggle;

und verwenden Sie den Konstruktor

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

Wenn die Schaltfläche zum Umschalten der Schublade dunkel wird, müssen Sie die in der Support-Bibliothek bereitgestellte supportActionBar verwenden.

Sie können supportActionbar über diesen Link implementieren: http://developer.android.com/training/basics/actionbar/setting-up.html

Abhi1227
quelle
Danke, ein manueller Import von import android.support.v7.app.ActionBarDrawerToggle;hat bei mir funktioniert. Obwohl ich normalerweise Autoimporte habe, hat dieser nicht automatisch importiert.
Azurespot
Und löschenimport android.support.v4.app.ActionBarDrawerToggle;
VikingGlen
8

Anstelle von

drawer.setDrawerListener(toggle);

Sie können verwenden

drawer.addDrawerListener(toggle);
Erluxman
quelle