Як замінити застарілий android.support.v4.app.ActionBarDrawerToggle


127

Вчора (17-10-2014) У мене є оновлення Android SDK і support-library-v4.jarмоє додаток, тепер я отримую попередження старіння , пов'язане з ActionBarDrawerToggle, читанням документації здається , що я повинен використовувати ActionBarDrawerToggleв support-library-v7.appcompact.jar.

Ось деякі частини моєї діяльності, які можуть бути рівномірно:

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

}

Я спробував скопіювати support-library-v7 та замінити

import android.support.v4.app.ActionBarDrawerToggle;

з

 import android.support.v7.app.ActionBarDrawerToggle;

це спричинило проблему компіляції в

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

Так що я намагався замінити R.drawable.action_drawerз

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

ця компіляція, але аварія під час виконання програми

 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)

Зверніть увагу, що android-support-v7-appcompat.jarправильно додано у залежність від проекту введіть тут опис зображення


1
Змініть імпорт з v4 на v7 і він спрацював
Ахмед

Відповіді:


66

Додавання лише android-support-v7-appcompat.jarзалежностей від бібліотеки недостатньо, ви також повинні імпортувати у свій проект модуль, який ви можете знайти у своєму SDK на шляху, \android-sdk\extras\android\support\v7\appcompatа потім додавати залежності модуля, що налаштовує структуру проекту таким чином

введіть тут опис зображення

в іншому випадку включаються лише файли класів бібліотеки підтримки, і додаток не може завантажувати інші ресурси, що викликають помилку.

Крім того, як reVerse запропонував замінити це

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

з

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

Дякую, що ви працюєте! Однак кнопка перемикання ящика стає темною, як можна змінити колір?
AndreaF

update
Drawer


60

Не потрібно використовувати супервиклик, ActionBarDrawerToggleякий вимагає Панелі інструментів . Це означає замість використання наступного конструктора:

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

Ви повинні використовувати цей:

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

Тому в основному єдине, що вам потрібно зробити, - це видалити свій власний drawable:

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

Докладніше про "новий" ActionBarDrawerToggle в Документах (натисніть) .


Я намагався дотримуватися вашої пропозиції, але збої з цим питанням: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

Ви користуєтеся Eclipse так? Ви перевірили android-support-v7-appcompat.jarв своїх властивостях проекту -> Java Build Path -> Замовлення та експорт? Крім того, може бути корисним перемістити v7-appcompat вгору.
reVerse

Я використовую IntelliJ Я додав android-support-v7-appcompat.jarдо проектних залежностей тим же способом support-v4 (інакше навіть не компілюється)
AndreaF

1
На жаль, я не знайомий з IntelliJ. В Android Studio вам просто потрібно додати compile "com.android.support:appcompat-v7:21.0.0"до свого build.gradleфайлу, і ви готові йти.
reVerse

Я багато разів перевіряв, чи правильно налаштована залежність бібліотеки, є якась інша причина, яка спричиняє проблему, я вважав, що бібліотека може бути пошкоджена, але я намагався завантажити та додати її знову від менеджера SDK без результату
AndreaF

27

ви повинні використовувати import android.support.v7.app.ActionBarDrawerToggle;

і використовувати конструктор

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

і якщо кнопка перемикання ящика стає темною, ви повинні використовувати supportActionBar, наданий у бібліотеці підтримки.

Ви можете реалізувати панель підтримкиAction за цим посиланням: http://developer.android.com/training/basics/actionbar/setting-up.html


Дякую, import android.support.v7.app.ActionBarDrawerToggle;для мене працював імпорт вручну . Незважаючи на те, що у мене зазвичай є автоматичний імпорт, він не імпортував авто.
Azurespot

І видалітьimport android.support.v4.app.ActionBarDrawerToggle;
VikingGlen

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.