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