如何替换不推荐使用的android.support.v4.app.ActionBarDrawerToggle


127

昨天(2014年10月17日),我已经更新了Android SDK和support-library-v4.jar我的App,现在我收到了有关弃用警告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,并且可以正常工作
Ahmed 2015年

Answers:


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

谢谢作品!但是抽屉切换按钮变暗,如何更改颜色?
2014年

更新抽屉未显示在Jelly Bean和以前的版本上
AndreaF 2014年


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 2014年

您正在使用Eclipse吗?您是否检查了android-support-v7-appcompat.jar项目属性-> Java构建路径->订单和导出?此外,将v7-appcompat移至顶部可能会有所帮助。
2014年

我使用IntelliJ android-support-v7-appcompat.jar以相同的support-v4方式将其添加到项目依赖项中(否则甚至无法编译)
AndreaF 2014年

1
不幸的是,Mhkay我对IntelliJ并不熟悉。在Android Studio中,您只需要添加compile "com.android.support:appcompat-v7:21.0.0"build.gradle文件中就可以了。
2014年

我已经检查了很多次库依赖项是否正确配置,还有其他原因导致该问题,我认为该库可能已损坏,但是我尝试从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。

您可以通过以下链接实现supportActionbar:http : //developer.android.com/training/basics/actionbar/setting-up.html


谢谢,手动导入import android.support.v7.app.ActionBarDrawerToggle;对我有用。即使我通常有自动导入功能,但那个也没有自动导入功能。
Azurespot 2015年

并删除import android.support.v4.app.ActionBarDrawerToggle;
VikingGlen 2015年

8

装了

drawer.setDrawerListener(toggle);

您可以使用

drawer.addDrawerListener(toggle);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.