【问题标题】:Floating Action Button appears over Navigation Drawer浮动操作按钮出现在导航抽屉上
【发布时间】:2015-03-06 07:46:07
【问题描述】:

所以我使用https://github.com/neokree/MaterialNavigationDrawer 作为我的导航抽屉和https://gist.github.com/Jogan/9def6110edf3247825c9 作为我的FAB 实现。当我打开导航抽屉时,它没有覆盖 FAB,并且按钮出现在它的顶部。我想避免隐藏按钮并在抽屉打开/关闭时显示它,因为这会分散注意力。有想法该怎么解决这个吗?

编辑: 我正在以编程方式添加 FAB:

fabButton = new FloatingActionButton.Builder(this)
            .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit))
            .withButtonColor(0xFF2196F3)
            .withGravity(Gravity.BOTTOM | Gravity.END)
            .withMargins(0, 0, 16, 16)
            .create();

将该声明更改为片段并不能修复它。我在上面链接的导航栏实现需要从 MaterialNavigationDrawer 类扩展的活动,该类可能首先绘制导航抽屉,而按钮始终位于最后。有没有办法以编程方式强制元素排序?

【问题讨论】:

    标签: android navigation-drawer material-design floating-action-button


    【解决方案1】:

    我正在更新 Nikola Despotoski 解决方案:

    因此,您还必须在设置 alpha 后禁用/隐藏 fab,这样如果用户在显示 fab 的位置点击任何时候都不会发生任何事情。

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open,
                    R.string.drawer_close) {
       public void onDrawerClosed(View view) {
                   // Visible/Enable the FAB
       }
    
       public void onDrawerOpened(View drawerView) {
                   // Hide/Disable the FAB
       }
    
       @Override
       public void onDrawerSlide(View drawerView, float slideOffset) {
                    // invert the slideOffset value
                    fab.setAlpha(1-slideOffset);
       }
    };
    

    【讨论】:

      【解决方案2】:

      这是一个适合我的替代解决方案。 假设您想在 yourlayout.xml 中添加 FAB。 现在在 yourlayout.xml 中创建一个框架布局

          <FrameLayout
              android:id="@+id/myframelayout"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
      

      现在在 FloatingActionButton.java 中替换方法

      public FloatingActionButton create() {
        ...
        ViewGroup root = (ViewGroup) activity.findViewById(android.R.id.content);
        root.addView(button, params);
        return button;
      }
      

       public FloatingActionButton create(FrameLayout framelayout) {
        ...
        framelayout.addView(button, params);
        return button;
      }
      

      现在像这样更改 FAB 声明。

      FrameLayout yourframelayout = (FrameLayout)findViewById(R.id.myframelayout);
      
      fabButton = new FloatingActionButton.Builder(this)
              .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit))
              .withButtonColor(0xFF2196F3)
              .withGravity(Gravity.BOTTOM | Gravity.END)
              .withMargins(0, 0, 16, 16)
              .create(yourframelayout);
      

      就是这样!!

      【讨论】:

        【解决方案3】:

        我找到了一个简洁的解决方案,它不涉及 alpha 或在抽屉打开或关闭时切换按钮(这看起来像是延迟)。以编程方式,您可以修改按钮的结束边距,以便它在抽屉的偏移量发生变化时过渡到 Activity 的窗口之外。

        所以首先,在onDrawerSlide方法之外,你必须使用以下代码获取FAB的布局参数(取决于按钮所在的布局,在我的例子中,它是一个FrameLayout):

        final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fab.getLayoutParams();
        

        明白我是根据一个简单的数学线性方程来做这个的:y = mx + n,而'y'是边距,'m'是斜率(你可以修改它),'x'是slideOffset 和 'n' 是默认/原始边距 (16dp)。这就是您如何将默认边距和斜率作为像素分配给变量,同时尊重显示密度的丰富性:

        int density = (int) Resources.getSystem().getDisplayMetrics().density;
        final int defaultMargin = 16 * density;
        final int slope = -100 * density;
        

        然后,在onDrawerSlide 中,执行以下操作:

        params.setMarginEnd((int) (slope * slideOffset + defaultMargin));
        fab.setLayoutParams(params);
        

        如果这对您不起作用,请尝试在构建按钮时设置按钮的 marginEnd,或者像这样设置布局参数的边距(尽管您必须检查 marginEnd 是右还是左) :

        params.setMargins(int left, int top, int right, int bottom);
        

        我希望这会有所帮助。这是我的第一个答案,所以我希望你不会对此有太多抱怨。

        【讨论】:

          【解决方案4】:

          当导航抽屉打开时您会看到 FAB,因为此 FAB 实现将 FAB 添加到内容视图 (android.R.id.content)。根据导航抽屉的实现,它们似乎在视图层次结构中处于同一级别。

          如果您不想切换到不同的 FAB 实现。使用onDrawerSlide(View drawerView, float offset) 并在打开抽屉时更改FAB alpha。您也可以在 onDrawerClose()onDrawerOpen() 方法中切换其可见性。

          编辑:

          @Override
          public void onDrawerSlide(View drawerView, float offset){
             fabButton.setAlpha(offset);
          }
          

          【讨论】:

          • 我尝试改变可见性并且它有效,但是动画将注意力从抽屉吸引到按钮上。能否请您详细说明 alpha,我对它不是很熟悉。
          • 好吧,您还有两个选择:修改原始实现以将 FAB 添加到您的片段布局或在导航抽屉偷看时隐藏 fab。请参阅我对您有关更改 alpha 的问题的编辑。
          • 其实这个实现效果很好。不过有一个变化 - 它需要 setAlpha(1-offset) 因为当抽屉打开时按钮需要消失。
          • 这个解决方案效果很好,除了我使用了1 - offset。然而,当我的抽屉打开并且我旋转设备时,FAB 不会回来......所以我将 FAB alpha 值作为实例变量存储在 MainActivity 中,并通过 onCreate( ) / onSaveInstanceState 将其保存/恢复到 Bundle 中( )。这修复了方向更改用例。
          • 解决方案不错,但是倒过来了。 @Andy H 解决方案完全有效。
          猜你喜欢
          • 2016-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多