调用 closeDrawers 时导航抽屉不会关闭 - 计时问题

2024-02-24

当单击导航抽屉列表中的项目时,我试图关闭导航抽屉。我有 2 个活动 A 和 B。以下代码对于 A 和 B 都是相同的:

final DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ListView mDrawerList = (ListView) findViewById(R.id.left_drawer);

// Set the list's click listener
mDrawerList.setOnItemClickListener(new OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
        Intent intent = null;

        // first just close the drawer
        mDrawerLayout.closeDrawers();

        if (position == 0) { // Activity A
            intent = new Intent(v.getContext(), ActivityA.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
        else if (position == 1) { // Activity B
            intent = new Intent(v.getContext(), Activity B.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
    }
});

我想要做的是,当用户离开活动时关闭导航抽屉,这样当他回来时,抽屉就会关闭并且不会保持打开状态。

然而,上面的代码不起作用:

  • 如果我在活动 A 中,然后转到活动 B,然后从 B 返回到 A(全部通过导航抽屉),A 中的抽屉保持打开状态

  • 但如果我在活动 A 中,并且单击活动 A 的项目,我会看到抽屉关闭得很好

我尝试做一些日志记录:

/** Called when a drawer has settled in a completely closed state. */
@Override
public void onDrawerClosed(View view) {
    super.onDrawerClosed(view);
    Log.i("foo", "drawer closing");
}

/** Called when a drawer has settled in a completely open state. */
@Override
public void onDrawerOpened(View drawerView) {
    super.onDrawerOpened(drawerView);
    Log.i("foo", "drawer opening");
}

我发现:

  • 如果我正在进行一项活动并单击抽屉中该活动的项目,抽屉将关闭

  • 但如果我去参加另一项活动,抽屉就会NOT close

我觉得这很奇怪,所以我认为这可能是一个时间问题。所以我试着在打电话后等待1秒closeDrawers()在做其他事情之前(即改变活动):

// Set the list's click listener
mDrawerList.setOnItemClickListener(new OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> arg0, final View v, final int position, long arg3) {

        // first just close the drawer
        mDrawerLayout.closeDrawers();

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = null;
                if (position == 0) { // Activity A
                    intent = new Intent(v.getContext(), ActivityA.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    startActivity(intent);
                }
                else if (position == 1) { // Activity B
                    intent = new Intent(v.getContext(), ActivityB.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    startActivity(intent);
                }
            }
        }, 1000);
    }
});

果然,抽屉成功关上。

我的问题是:

  • 为什么会发生这种情况?我认为它们(关闭抽屉、更改活动)都按顺序在同一个线程上运行,因此一个必须在另一个线程执行之前完成?
  • 如何确保导航抽屉在执行其他操作之前关闭?

正如你提到的,这是关于时间问题的startActivity会比关闭执行得更快NavigationDrawer.关于你的第二个问题,你可以设置一个DrawerListener为此,在您的导航完全关闭后,开始您的第二个活动:

mDrawerLayout.setDrawerListener(new DrawerListener() {

        @Override
        public void onDrawerStateChanged(int arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onDrawerSlide(View arg0, float arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onDrawerOpened(View arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onDrawerClosed(View arg0) {

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

调用 closeDrawers 时导航抽屉不会关闭 - 计时问题 的相关文章

  • 当同级滚动到达末尾时打开底部工作表吗?

    有没有办法将滚动事件从一个滚动视图 转发 到我的底部工作表 以便当我过度滚动第一个滚动视图时我的底部工作表开始展开 考虑这个小应用程序 public class MainActivity extends AppCompatActivity
  • DESFire EV1 卡模拟

    我需要在 Android 设备上模拟 DESFire EV1 卡 但是 我对如何将 Mifare SDK 精简版或高级版 与 HCE 结合使用感到困惑 这可能吗 我需要启动该项目 并且对如何在 DESFire 卡中存储和加密数据进行了大量研
  • x 轴上带有日期的散点图 -- 在 X 轴上添加自定义标签

    我想要一个 x 轴为日期的散点图 因为如果我使用ChartFactory getTimeChartView我收到一个折线图 问题是 我用当前日期作为 x 轴 数据 用户输入 作为 y 轴进行绘图 我将这些数据 日期和用户数据 存储在列表和文
  • cordova - 错误:无法获取平台 android

    我安装了 cordova 并创建了一个新项目 但是当我使用这个命令添加android平台时 cordova平台添加android 出现此错误 Error Failed to fetch platform android Probably t
  • 在多台计算机上使用相同的调试密钥库

    我正在多台计算机上进行开发 如果我直接从一台计算机上的 Eclipse 部署到手机 则在不先卸载的情况下无法从另一台计算机进行部署 我假设这是因为有一个调试证书用于签署应用程序 并且它们在两台机器上并不相同 是否可以将一台机器复制到另一台机
  • Material TextInputLayout 样式不起作用

    Material TextInputLayout 样式不起作用 我在这里遵循了有关材质 textinputlayout 的文档 https material io develop android components text input
  • 纯java adb客户端[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 ADB http developer android com tools help adb html分
  • 使用 HTML5 启用后置摄像头

    我正在开发一个使用 MVC ASP Net 4 HTML5 的项目 默认浏览器是 google chrome v29 0 1547 57 我可以与这些工具交互并拍照 但只能使用前置摄像头 如何启用后置摄像头 平板电脑的特点 三星 Galax
  • 如何在Android中将位图转换为PNG,然后转换为base64?

    正如标题所暗示的 我试图让我的 Android 应用程序的用户从他的设备中选择一个图像 完成 然后我想缩小图像 完成 将图像压缩 转换为 png 并发送它作为 Base64 字符串发送给 API 所以我目前调整图像大小 如下所示 optio
  • 阻止 Android WebView 尝试在 loadData() 上加载/捕获 CSS 等资源

    背景 这似乎与许多其他问题重复 相信我 事实并非如此 我正在尝试将 html 数据加载到WebView https developer android com reference android webkit WebView html 能够
  • iOS 是否有像 Android 一样的应用内更新功能?

    我为 Android 和 iOS 开发了一个移动应用程序 现在每周我们都会发布 2 个更新 大多数时候 Android 和 iOS 用户会停止应用程序的自动更新 但是 如果有重要更新或错误修复或新功能 那么我们必须要求用户更新应用程序以获得
  • Android gradle 无法找到方法 'org.grade.api.internal.file.DefaultSourceDirectorySet'

    我尝试将 java 类转换为 Kotlin 除了出现以下错误之外 它工作正常 我尝试重新下载下面建议的所有依赖项 但无济于事 请帮助我解决此错误 Error Error 2 0 Unable to find method org gradl
  • 如何向通话记录数据库添加新字段和记录?

    我正在尝试制作 VoIP 应用程序 我想知道是否可以通过呼叫日志内容提供商执行以下操作 我想为 VoIP 呼叫添加新的呼叫日志记录以及常规呼叫的呼叫日志 如何向现有通话记录内容提供商添加新记录 我想将自定义字段添加到呼叫日志中 例如会话 I
  • Android M 运行时权限中的“Never-Asked”和“Stop-Asking”如何区分?

    当谈到 M Developer Preview 运行时权限时 根据Google https plus google com AndroidDevelopers posts 8aaudh5n1zM linkId 16190516 如果您以前从
  • 将文本从一个 EditText 框逐个字符地即时复制到同一 Activity 中的另一个框

    我正在构建一个应用程序来转换纬度和经度 各种格式之间 我的布局已完成 但我当前的布局 挑战是这样的 对于 Degree 值 当用户在 EditText1 中输入值时 我想要 当他们打字时 它会在 EditText2 中实时复制字符 为了性格
  • Android 中的 SeekBar 和媒体播放器

    我有一个简单的播放器和录音机 一切都很好 但有一个问题 我想添加搜索栏来查看播放记录的进度 并使用此搜索栏来设置播放器应该播放的位置 我有 onProgress 但没有效果 这是代码 package com example recorder
  • Json 对象 - 获取键和值

    我是 JSON 的新手 所以 如果这是一个非常基本的疑问 请不要责骂我 我有一个 JSON 对象引用 我想获取 Key 对象只有一个键值对 我如何在 Java 中获得它 您可以使用jsonObject keys 获取所有钥匙 然后您可以迭代
  • 可以以编程方式打开“立即发言”对话框吗?

    是否可以通过编程方式打开 立即发言 对话框 目前 如果用户点击我的 搜索 按钮 则会打开一个对话框 并且我会自动打开软键盘 因此用户无需点击文本编辑字段 我想提供一个替代的 通过语音搜索 它将打开对话框并自动打开 立即发言 窗口 因此用户不
  • android中自动启动一个新的activity

    我正在创建一个 Android 应用程序 我有一个logo screen Activity 然后我的home screen another activity 我希望当我启动应用程序时 我的徽标屏幕应该出现 然后 2 秒后自动出现我的主屏幕
  • 如何使用NotificationCompat.Builder和startForeground?

    简短的问题 我正在尝试使用 NotificationCompat Builder 类来创建将用于该服务的通知 但由于某种原因 我要么看不到该通知 要么在该服务应该取消时无法取消它被破坏 或停止在前台 my code Override pub

随机推荐