如何替换已弃用的 android.support.v4.app.ActionBarDrawerToggle

2024-01-06

昨天(17-10-2014)我更新了 Android SDK 并support-library-v4.jar我的应用程序,现在我收到与以下内容相关的弃用警告ActionBarDrawerToggle, 阅读文档 https://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html看来我必须使用ActionBarDrawerToggle in 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;

with

 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 with

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)

Note that android-support-v7-appcompat.jar is correctly added in project dependencies enter image description here


仅添加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);
        }

with

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何替换已弃用的 android.support.v4.app.ActionBarDrawerToggle 的相关文章

  • Android 架构组件与 Firebase 特别是 Firestore

    我正在经历这个blog https firebase googleblog com 2017 12 using android architecture components html by 道格 史蒂文森 https twitter co
  • 当用户快速滚动时,如何延迟列表适配器中视图的加载

    我的列表视图中有从互联网下载的图像 我想在 getView 中添加一些内容 以便在用户快速滑动 滚动时它不会下载图像 我怎样才能开始这样做呢 您可以按照以下步骤延迟 ListView 中视图的加载 首先 你应该让你的ListView对象和Y
  • Android Studio Profiler 中显示“无可调试进程”

    当我尝试在 Android Studio 中使用探查器时 我能够看到已连接的设备 但在探查器中收到 无可调试进程 有人可以帮助我为什么我收到 不可调试的进程 吗 您可以尝试以下任意 全部操作 使缓存失效并重新启动Android Studio
  • POST 请求出现 500 内部服务器错误

    这是我向服务器发送 POST 请求的代码 要发布到服务器的 JSON User Name dog Password 123 我如何创建 JSON 对象 object new JSONObject JSONObject jsonObject
  • 旋转对话框的自定义主题

    我想自定义当我单击 spinnermode dialog 中的微调器时出现的对话框的外观 我想使用对话框片段 但没有找到文档 是否可以 不会 外观是固定的 给人一种操作系统的感觉 您必须创建自己的微调器才能执行此操作 这并不容易 但如果微调
  • SQLite 中的 where 子句在 android 中不起作用:(

    当尝试在 SQLite 中查询某些数据时 我遇到了一个恼人的错误 这是我的代码 Cursor cursor db query TABLE IMAGES new String id name compareToThis null null n
  • 旧 Android SDK 版本上的 java.lang.NoClassDefFoundError

    我在 Google Play 上发布了我的应用程序的一个版本 今天早上醒来时发现了一些不满意的客户 该应用程序的最新版本集成了对蓝牙低功耗 BTLE 心率监测器的支持 该应用程序在 Android 4 3 和 4 4 上运行良好 但在 4
  • 为什么Volley的onResponse没有被调用

    我正在通过 Volley 获取 json 数据 我遇到的问题 那是凌空的onResponse从未被调用 因此不会解析和显示数据 JSON 数据示例 title This is a sample text title title cat or
  • Kotlin + Room:java.lang.IllegalArgumentException:void 无法转换为元素

    我试图在我的 Java Kotlin 项目中添加 Room 但是当我尝试编译该项目时 它失败了 app kaptDebugKotlin出现以下错误 e java lang IllegalStateException failed to an
  • 使用 Backstack 时 TabLayout ViewPager 未加载 [重复]

    这个问题在这里已经有答案了 我在一个片段中使用 TabLayout 和 viewPager 在选项卡下方的两个片段之间切换 当我单击下部片段之一内的 FAB 时 我会加载一个新片段 用于输入 但是 当我按 后退 按钮时 TabLayout
  • 使用 Android Exoplayer 调整 Dash 流音量

    我正在尝试设置一个搜索栏来控制 exoplayer 流式破折号实例的级别 我正在使用的设置是演示项目的修改版本 并且无法确定我应该尝试影响搜索栏输出的哪个元素 即如何正确使用 MSG SET VOLUME 等 任何意见将不胜感激 我正在寻找
  • ArgumentMatchers.any 不得为 null

    我正在尝试测试ViewModel以确保实时数据得到正确更新 然而使用时ArgumentMatchers any 它失败了IllegalStateException saying ArgumentMatchers any mViewModel
  • 免费和付费版本 Android 应用程序的最佳方法?

    我开发了一个 Android 应用程序 我希望它可以作为免费版本和付费版本提供 最好的方法是什么 我可以想到三种解决方案 将项目分成两个分支并维护它们 创建一个库项目并有两个附加项目 一个 免费 版本和一个 付费 版本 使用应用内结算 问
  • 如何在 Android 上通过 RTMP 进行流式传输?

    我正在尝试在远程服务器上播放视频文件 视频格式为flv 服务器为Flash Media Server3 5 我将通过 RTMP 连接到服务器并使用 Android Media Player 实现视频文件的播放 真的吗 可能吗 任何帮助都是我
  • 将 XML 从网站解析到 Android 设备

    我正在启动一个 Android 应用程序 它将解析来自网络的 XML 我创建了一些 Android 应用程序 但它们从未涉及解析 XML 我想知道是否有人对最佳方法有任何建议 这是一个例子 try URL url new URL your
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • 更改适配器数据时,RecyclerView 滚动到顶部位置

    我正在对某个帖子进行喜欢和不喜欢RecyclerView 我在更改视图后调用api 但问题是RecyclerView当我通知它更新时 总是滚动到顶部 这是我的适配器代码 likeAnim setOnLikeListener object O
  • 通过使用 DownloadManager,我如何查看设备中所有活动/正在运行的下载?

    通过使用 DownloadManager 我如何查看设备中所有活动 正在运行的下载 My code DownloadManager Query query null Cursor c null DownloadManager downloa
  • 在 Android KitKat 中接收彩信

    所以这个视频Android 4 4 短信 API http www youtube com watch v mdq0R2WQssQ DevBytes 解释了 KitKat 中 SMS API 的最新变化 他们还提供了示例项目的链接 http
  • 如何以编程方式设置带有密码的屏幕锁定?

    有没有人可以帮我设置密码以锁定屏幕 谢谢 在您的应用程序中使用此代码 它对我有用 DevicePolicyManager devicePolicyManager DevicePolicyManager getSystemService Co

随机推荐