我有一个嵌套如下的布局(我使用的是伪代码并为了简洁而跳过一些标签)
活动布局:
CoOrdinatorLayout
- AppBarLayout
- FragmentOne
- FragmentTwo
片段两个布局使用AppBarLayout.ScrollingViewBehavior但包含FAB:
CoOrdinatorLayout
- FloatingActionButton
- TabLayout
所以运行时层次结构看起来像
CoOrdinatorLayout (Activity)
- AppBarLayout
- LinearLayout (FragmentOne)
- CoOrdinatorLayout (FragmentTwo)
- FloatingActionButton
- TabLayout
FAB应该锚定在视口的右下角(物理屏幕),而是(因为行为)位于viewpager的右下角(其中包含每个页面上的列表)。 这意味着FAB仅在布局滚动到最后时才可见(并且应用栏布局已折叠)
有没有什么方法可以让FAB锚定到视口,而它是这样嵌套的?将其移至活动不是一个好的选择
编辑 - 已经有几天了,所以我添加了我在下面使用的解决方案,但是如果有人可以提出更清晰,基于XML的工作方式解决方案我将改变接受的答案,因为这就是我所追求的
答案 0 :(得分:0)
我使用的解决方案是Programmaticaly在Fragment中创建FAB(因此片段仍然是正确负责实现它的听众等)然后将它附加到Activity的CoOrdinator布局(我发现在活动中使用getter接口,因为它似乎是使用getActivity().findViewById(...)
的更清晰的替代方法)
public class MyActivity extends implements MyCallbacks {
...
}
public interface MyCallbacks {
CoordinatorLayout getCoordinatorLayoutRoot();
}
public class MyFragment extends Fragment {
...
private void setupNewFab() {
final CoordinatorLayout rootCoordinator = ((MyCallbacks) getActivity())
.getCoordinatorLayoutRoot();
final LayoutInflater inflater = (LayoutInflater) getActivity()
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
final FloatingActionButton fab = (FloatingActionButton) inflater.inflate(
R.layout.my_fab_definition, rootCoordinator, false);
fab.setOnClickListener(v -> myAction());
rootCoordinator.addView(fab);
}
}
有一点需要注意的是,我使用了这种通胀方法,因为在View.inflate(...)
的结果上设置点击监听器似乎无法正常工作