浮动操作按钮显示在导航抽屉上

时间:2015-01-08 08:43:18

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

所以我使用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类扩展,该类可能首先绘制导航抽屉,使按钮始终为最后。有没有办法以编程方式强制元素的排序?

4 个答案:

答案 0 :(得分:8)

导航抽屉打开时,您会看到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);
}

答案 1 :(得分:2)

我发现了一个整洁的解决方案,它不会涉及alpha或在抽屉打开或关闭时切换按钮(这使得它看起来像延迟)。通过编程方式,您可以修改按钮的结束边距,以便在抽屉的偏移发生变化时,它会从活动窗口中移出。

首先,在onDrawerSlide方法之外,您必须使用以下代码获取FAB的布局参数(取决于按钮的布局,在我的情况下,它&& #39; sa 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);

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

答案 2 :(得分:1)

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

    <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 :(得分:0)

我正在更新 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);
   }
};