7

所以我使用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

4 回答 4

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);
}
于 2015-01-08T21:42:39.360 回答
2

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

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

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

于 2015-02-14T23:04:40.080 回答
1

这是对我有用的替代解决方案。假设您想在 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);

而已!!

于 2015-02-26T09:01:47.310 回答
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);
   }
};
于 2016-10-10T14:18:44.157 回答