【问题标题】:Snackbar's setAnchorView does not consistently work after launching an Activity启动 Activity 后,Snackbar 的 setAnchorView 无法始终正常工作
【发布时间】:2021-05-12 15:33:49
【问题描述】:

在我的 Android 应用程序中,我尝试使用 setAnchorView(toolbar) 在工具栏项上方显示 Snackbar。我在启动我的活动后不久创建并显示 Snackbar。它大约有 33% 的时间工作 - 其余时间,Snackbar 从屏幕底部显示(好像从未调用过 setAnchorView)我怎样才能让它 100% 的时间工作?

在 Activity 开始时显示 Snackbars 时,我只有这个随机显示问题。在 Activity 运行几秒钟后显示带有 setAnchorView 的其他 Snackbar 时,它始终按预期工作并显示在工具栏上方。

下面是一些示例代码:

        View v = findViewById(R.id.main_relative_layout);
        Snackbar sn = Snackbar.make(v, R.string.snackbar_info_starting, Snackbar.LENGTH_SHORT);
        sn.setAnchorView(R.id.toolbar);
        sn.show();

我在 com.google.android.material:material:1.3.0(当前最新版本)和 1.2.0 中观察到了相同的行为。

我尝试添加一些调试语句来验证工具栏对象是否存在。当我在调用setAnchorView 时遇到此问题时,我怀疑该对象可能为空。我的猜测是不正确的: Toolbar 对象总是被创建并且非空,无论它是否正常工作。这是对象字符串表示:android.widget.LinearLayout{2e0f901 V.E...... ......ID 0,0-0,0 #7f080237 app:id/toolbar}

有什么建议吗?我怀疑工具栏 UI 元素未处于 setAnchorView 使用的“就绪”状态,但我没有足够的 Android 知识来诊断或解决此类问题。

【问题讨论】:

    标签: android


    【解决方案1】:

    我想我使用来自另一个问题的信息找到了解决方法:How can you tell when a layout has been drawn?

    我现在怀疑工具栏没有完全拉出 - 我可以看到工具栏的 getY() 在活动启动后立即调用它时始终为“0”。 (但是,即使工具栏的 getY() 为 0,有时 Snackbar 也会显示在正确的位置!)。

    根据这个假设,我使用此代码仅在工具栏被绘制后显示 Snackbar:

    View toolbar = findViewById(R.id.toolbar);
    toolbar.post( new Runnable() {
        @Override
        public void run() {
          View v = findViewById(R.id.main_relative_layout);
          Snackbar sn = Snackbar.make(v,
                                      R.string.snackbar_info_starting, 
                                      Snackbar.LENGTH_SHORT);
          sn.setAnchorView(R.id.toolbar);
          sn.show();
        }
      });
    

    实施此操作后,我无法重现该问题。

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 2016-07-28
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      相关资源
      最近更新 更多